【发布时间】:2014-07-16 00:01:51
【问题描述】:
以下代码中的第二次删除会导致程序崩溃,因为它之前已经被删除过:
int* i = new int;
delete i;
delete i;
尝试使用异常来捕获它也无济于事:
int* i = new int;
delete i;
try {
delete i;
} catch(exception& e) { // program just crashes, doesn't go into this exception block
cout << "delete failed" << endl;
}
如何进行安全删除(先检查指针指向的区域是否已经被删除)?
或者如果不可能的话,如何吐出发生crash的行号(不用调试工具)?
【问题讨论】:
-
无法安全删除。
-
你能做的最好的就是在删除后将 I 设置为 NULL。或者,只是不要双重删除! (使用 RAII,你根本不需要删除)。
-
没有便携的方式。取决于架构、操作系统、分配库......在某些情况下,它甚至可能不会在第二次删除时崩溃,但要晚得多。在某些情况下,它可能会引发 SIGABORT……在其他情况下,它可能是 SIGSEGV。
-
@OliCharlesworth:
nullptr在 C++11 中 -
或者定义你自己的重载删除操作符(比如调试构建),如果你可以接受这个开销(=检测和抛出,不要忽略)...
标签: c++