想象一下,在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
因此,请提出我是否应该处理这种情况的建议,以及如何在编写适当的代码和指针控件的同时了解自己。是否可以在这种情况下创建回调函数(或重写中断信号)?
答案 0 :(得分:6)
在此类崩溃后尝试清理是傻瓜的事。运行时环境很可能会过于损坏而无法进行恢复,更糟糕的是,损坏的环境可能导致您的Warning: Error in $.shinyoutput: Reading objects from shinyoutput object not allowed.
调用产生意外的结果,甚至可能有害。
这就像在房子着火时试图打扫房间。尽可能快地走出去,直到被严重烧伤。
答案 1 :(得分:2)
当进程收到段错误时,它将终止,并且操作系统将释放其分配的资源。那时不必担心泄漏。
在C ++中,可以使用释放析构函数对其进行修复
不。异常终止时不会执行析构函数。
您可以执行的操作是捕获段错误信号,但仅限于使用异步信号安全功能。处理内存分配的功能并不安全。如果有操作系统以外的其他资源(可能是在某些远程系统上)分配的资源,则可以尝试在处理程序中释放它们,但是由于异步信号处理程序的局限性,这可能是一个挑战。