何时删除 try-catch 块中的指针

When to delete pointer in try-catch block

本文关键字:指针 删除 try-catch 何时      更新时间:2023-10-16

快速最佳实践问题(注意,我不允许在此代码中使用任何智能指针(。我的印象是,如果我传递指向函数的指针并且发生异常情况,那么如果从未在调用的函数或首次分配内存的函数中删除内存,则内存会泄漏。删除 catch 块中的内存是否安全,还是应该删除调用函数中的内存?

例:

int main() {
object* myPtr = new object(); //dynamic memory on heap
foo(*myPtr);  //pass pointer to function foo
return 0;
}
void foo(object &pointer) {
try {
/* do stuff here
with the pointer */
}
catch (const char &e) {
cout<< "An error occured: " << e << endl;
}
catch (...)
cout<< "Caught unknown exception." << endl;
}
}

我应该在函数返回后删除指针吗?

int main() {
object* myPtr = new object(); //dynamic memory on heap
foo(*myPtr);  //pass pointer to function foo
delete myPtr;
return 0;
}

还是在试抓块中?

void foo(object &pointer) {
try {
/* do stuff here
with the pointer */
}
catch (const char &e) {
cout<< "An error occured: " << e << endl;
delete &pointer;
}
catch (...)
cout<< "Caught unknown exception." << endl;
delete &pointer;
}
}

何时删除 try-catch 块中的指针

不要。

main中删除它,在调用foo之后。

简而言之,将其删除在创建它的位置。其他任何东西都会造成混乱的不对称。


我的印象是,如果我传递指向函数的指针并且发生异常情况,那么如果内存从未被删除,则内存就会泄漏。

不知道你从哪里听来的。没关系。这是无稽之谈。


删除 catch 块中的内存是否安全,还是应该删除调用函数中的内存?

您可以:

  1. 删除try末尾和两个catch块中的内存
  2. try/catch链结束后删除内存

两者都是完全"安全的"。

但是,就像我说的——


我应该在函数返回后删除指针吗?

对,没错。


顺便说一句,福尔

您缺少*和大写拼写错误:

object* myPtr = new object();
//    ^             ^

实际上,带有智能指针的版本可能如下所示:

#include <iostream>
#include <memory>
struct object {};
void foo(object& obj)
{
try {
// do stuff here with the reference (not a pointer)
}
catch (const char* e) {
std::cout << "An error occured: " << e << std::endl;
}
catch (...)
std::cout << "Caught unknown exception." << std::endl;
}
}
int main()
{
auto myPtr = std::make_unique<object>();
foo(*myPtr);
}

我的印象是,如果我传递指向函数的指针并且发生了异常情况,那么如果从未在调用的函数或首次分配内存的函数中删除内存,则内存会泄漏。

不需要在分配内存的同一函数中释放内存。 但是,是的,一般来说,如果指针指向分配了new的内存,那么如果根本不调用delete它,那么它就会泄漏,无论实际调用的位置如何。

删除 catch 块中的内存是否安全,还是应该删除调用函数中的内存?

在您的示例中,foo()对如何分配object没有概念,因此不,在foo()内部调用delete是不安全的。

例如,您可以使用其中一个来调用foo(),如果调用delete,所有这些都会出现问题foo()

int main() {
object myObj;
foo(myObj);
return 0;
}

int main() {
std::unique_ptr<object> myPtr(new object);
foo(*myPtr);
return 0;
}

int main() {
std::vector<char> buffer(sizeof(object));
object *myPtr = new (&buffer[0]) object;
foo(*myPtr);
myPtr->~object();
return 0;
}

foo的角度来看,object如何分配并不重要,只要它是进入foo()的有效object实例即可。 由于main()决定如何分配object,因此main()应该是决定如何正确释放它的人(如果有的话(。