崩溃时释放分配的指针的正确方法

时间:2019-06-18 09:38:39

标签: 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

因此,请提出我是否应该处理这种情况的建议,以及如何在编写适当的代码和指针控件的同时了解自己。是否可以在这种情况下创建回调函数(或重写中断信号)?

2 个答案:

答案 0 :(得分:6)

在此类崩溃后尝试清理是傻瓜的事。运行时环境很可能会过于损坏而无法进行恢复,更糟糕的是,损坏的环境可能导致您的Warning: Error in $.shinyoutput: Reading objects from shinyoutput object not allowed.调用产生意外的结果,甚至可能有害。

这就像在房子着火时试图打扫房间。尽可能快地走出去,直到被严重烧伤。

答案 1 :(得分:2)

当进程收到段错误时,它将终止,并且操作系统将释放其分配的资源。那时不必担心泄漏。

  

在C ++中,可以使用释放析构函数对其进行修复

不。异常终止时不会执行析构函数。

您可以执行的操作是捕获段错误信号,但仅限于使用异步信号安全功能。处理内存分配的功能并不安全。如果有操作系统以外的其他资源(可能是在某些远程系统上)分配的资源,则可以尝试在处理程序中释放它们,但是由于异步信号处理程序的局限性,这可能是一个挑战。

相关问题