如果指针是一个函数 arguemente 并且正在通过引用传递值,我应该删除它吗?

Should I delete a pointer if it is a function arguemente and is being passed values by reference?

我确定这个问题已经在某些地方得到了回答,如果有的话请 link 我回答,但我正在努力寻找这个确切问题的答案。有很多非常接近。以下是一些我已经阅读过但不能完全回答我的问题的内容:

pass by reference and value with pointers Reason to Pass a Pointer by Reference in C++? Using delete on pointers passed as function arguments

大致情况如下,尽量贴近我的实际使用情况:

void func (vector<int>* foo) {

    int bar = foo->at(0);

    // transform bar

    foo->at(0) = bar;

    // Should I delete foo?
    delete foo;
}

int main() {

    vector<int> data (4, 0);

    data.at(0) = 5;

    for (int i = 0; i > 10; i++) {

        func(&data);

    }
}

编辑:上面的 for 循环应该是这样的:

for (int i = 0; i < 10; i++) {

因此,如您所见,我创建了一个名为数据的向量,然后将数据引用传递给该函数。该函数通过引用从数据中获取一个值,对其进行转换,然后通过引用将新值再次保存回数据。

在此特定场景中,此函数是唯一接收此数据的函数,但它会被重复调用并每次传递对相同数据的引用。

我的主要问题是,我应该在那个函数的末尾删除 foo 吗?另外,如果我有一个额外的函数也被传递了对数据的引用,那会改变答案吗?

我读过其他建议小心删除函数中的指针的问题,但它们都与首先声明为指针的数据类型有关。我一开始并没有声明指针或引用,只是创建一个引用作为函数的参数(我认为?)。

无论如何我问这个的原因是我的程序有一些严重的内存泄漏。我做了一些研究,并阅读了很多关于指针相关内存泄漏的内容,我发现这可能是它的一个来源

我试过在一个这样的函数的末尾添加一个 "delete" ,到目前为止一切似乎都很好......但我不想添加一大堆删除,然后一些时间在路上发现这是一个非常糟糕的主意 :D

提前干杯,皮特

您必须为每个 new 调用 delete(除了特殊的新展示位置)。

这里没有new,所以没有delete

Should I delete foo?

不,你不应该。

此外,您永远不应该使用 newdelete。而且你永远不会通过指针传递值。

相反,如果您想在函数中更改它,则通过引用传递它 (&)。

正确代码:

void func (vector<int> & foo) {

    try {
        int bar = foo.at(0);
    }
    catch (std::out_of_range) {
        // here you should process an exception 
        // when `foo` contains no elements
    }

    // transform bar

    foo.at(0) = bar;
}

int main() {

    vector<int> data (4, 0);

    data.at(0) = 5;

    for (int i = 0; i > 10; i++) {

        func(data);

    }
}

(注意:可能循环中一定是i < 10?)