何时删除 try-catch 块中的指针
When to delete pointer in try-catch block
快速最佳实践问题(注意,我不允许在此代码中使用任何智能指针(。我的印象是,如果我传递指向函数的指针并且发生异常情况,那么如果从未在调用的函数或首次分配内存的函数中删除内存,则内存会泄漏。删除 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 块中的内存是否安全,还是应该删除调用函数中的内存?
您可以:
- 删除
try
末尾和两个catch
块中的内存 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()
应该是决定如何正确释放它的人(如果有的话(。
- 使用函数引用指向节点的指针删除链表中的节点?
- 如何通过指向元组的共享指针删除对象
- 函数内的 C++ 指针删除
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 如何通过存储在 std::list 中的指针删除对象?
- C++中的智能指针删除
- 将C 中的每个指针删除作为阵列的指针安全吗?
- 使用 C 字符串和指针.删除除小写和空格以外的任何字符
- 在特定情况下,指针删除和铸造之间的关系不清楚
- 提升属性树:使用指向节点及其父节点的指针删除节点
- 警告C4150在尝试包装本机C 类时,指向不完整类型的指针删除
- C++ Valgrind 双指针删除,用于防止内存泄漏
- C 通过指向其基类的指针删除派生对象
- 将指针删除到数组
- 当通过其中一个指针删除对象时,C++将所有指针设置为null
- 智能指针删除器和"using"名称为"pointer"关键字
- 通过指向其基的指针删除 POD 对象是否安全
- 模板化的出列无效指针:删除类时失败
- 使用"this"指针删除
- (C++) list.error 方法和使用指针删除内存