c++ - 在崩溃时释放分配的指针的正确方法

标签 c++ c

想象一下在 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/

相关文章:

c - 如何继续输入频率和持续时间直到仅 100 个值并检索它们

c++ - mongodb c++ 驱动程序不更新

c - 如何从C中的文件中获取未知数量的字符串?

c - 将数字映射到 C 中的位位置

c++ - 高级 C++ : Copy configuration (object) in a template template class's instance

c - 基准测试-CPU时间大于墙时间?

c - 是否在其绑定(bind)的未定义行为之外访问全局数组?

c++ - 错误 : member function may not be declared outside of its class.

c++ - 解析一个 id 并实例化一个关联的类

c++ - 如何降低寻找最长之字形序列的时间复杂度?