想象一下在 C 程序中引起段错误,这是常见的(而且是糟糕的)。我应该注意在运行时分配的“仍然可达”指针吗?
我在谷歌上搜索了 Valgrind 对仍然可达指针的看法(还阅读了其他相关的 stackoverflow 主题),我了解到基本上这不是一个大问题,我不必担心它。但是我愿意。 在 C++ 中,可以通过使用释放析构函数来修复它,该析构函数将始终根据标准进行调用。
void lose_definetly() {
int * array = calloc(4,sizeof(int));
array[3] = 1232;
}
void proper_free() {
int * array = calloc(4,sizeof(int));
array[3] = 1232;
free(array);
}
void cause_segfault() {
int * array = calloc(4,sizeof(int));
array[-1232142144] = 1232;
free(array);
}
int main() {
lose_definetly();
proper_free();
cause_segfault();
return 0;
}
程序输出预期出现段错误:
Segmentation fault (core dumped)
Valgrind 的泄露报告:
==134== definitely lost: 16 bytes in 1 blocks
==134== indirectly lost: 0 bytes in 0 blocks
==134== possibly lost: 0 bytes in 0 blocks
==134== still reachable: 16 bytes in 1 blocks
==134== suppressed: 0 bytes in 0 blocks
因此,请建议我是否应该处理这种情况,以及除了编写正确的代码和指针控件之外我如何了解自己。是否可以在这种情况下创建回调函数(或覆盖中断信号)?
最佳答案
在发生此类崩溃后尝试进行清理是一件愚蠢的事情。更有可能的是,运行时环境太损坏而无法进行恢复,更糟糕的是,损坏的环境可能会导致您的 free
调用产生意外的、甚至可能有害的结果。
这就像当你的房子着火时试图清理你的房间。在被严重烧伤之前尽快离开。
关于c++ - 在崩溃时释放分配的指针的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56646109/