如果指针是一个函数 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?
不,你不应该。
此外,您永远不应该使用 new
或 delete
。而且你永远不会通过指针传递值。
相反,如果您想在函数中更改它,则通过引用传递它 (&
)。
正确代码:
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
?)
我确定这个问题已经在某些地方得到了回答,如果有的话请 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?
不,你不应该。
此外,您永远不应该使用 new
或 delete
。而且你永远不会通过指针传递值。
相反,如果您想在函数中更改它,则通过引用传递它 (&
)。
正确代码:
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
?)