如果指针是函数自变量并且通过引用传递值,我应该删除它吗

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

本文关键字:我应该 删除 引用 函数 指针 自变量 如果      更新时间:2023-10-16

我确信这个问题已经在某个地方得到了答案,如果有,请将我链接到它,但我很难找到这个确切问题的答案。有许多非常接近。以下是我已经读过的一些并不能完全回答我的问题:

通过引用和带指针的值传递C++中通过引用传递指针的原因?对作为函数参数传递的指针使用删除

这是一个基本的情况概述,试图使其非常接近我的实际用法:

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++) {

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

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

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

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

无论如何,我问这个问题的原因是,我的程序有一些严重的内存泄漏。我做了一些研究,读了很多关于指针相关内存泄漏的文章,我突然想到这可能是的一个来源

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

提前干杯,Pete

您必须为每个new调用delete(特殊的新放置除外)。

这里没有new,所以没有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?)