1
46
|
2
7
C++标准没有说明如何处理特定的信号——许多实现可能不支持。
编辑: 我刚刚通过了C++标准的快速搜索,我找不到任何指明信号如何与对象生命周期交互的东西-也许有比我更好的FU标准的人能找到一些东西? 进一步编辑: 在回答另一个问题时,我在标准中发现:
因此,似乎必须在收到信号时调用析构函数。 |
3
3
另一个不会被调用的情况是,如果您使用的是多态性,并且没有使您的基析构函数成为虚拟的。 |
4
3
信号 独自一人 不会影响执行 当前线程 因此调用析构函数,因为它是一个不同的执行上下文,有自己的堆栈,而您的对象不存在。这就像一个中断:它被处理在执行上下文之外的某个地方,如果被处理,控制权就会返回到程序。 与多线程一样,C++ 语言 不知道信号的概念。这两个标准完全正交,由两个不相关的标准规定。它们如何交互取决于实现,只要它不违反任何一个标准。 另一种情况是,当对象的析构函数不被调用时,它的构造函数抛出异常。不过,成员的析构函数仍将被调用。 |
5
2
|
6
2
如果一个函数或方法有一个throw规范,并且抛出了规范未涵盖的内容,那么默认行为是立即退出。堆栈没有解开,也不调用析构函数。 POSIX信号是一个操作系统特定的构造,没有C++对象范围的概念。一般来说,除了信号可能会做任何事情,除了捕获信号,设置全局标志变量,然后在信号处理程序退出之后,在C++代码中处理它。 GCC的最新版本允许您从同步信号处理程序中抛出异常,这会导致预期的展开和破坏过程。不过,这是非常特定于操作系统和编译器的 |
7
2
这里有很多答案,但仍然不完整! 我发现了另一个没有执行析构函数的案例。当异常跨越库边界时,总是会发生这种情况。 请在此处查看更多详细信息: Destructors not executed (no stack unwinding) when exception is thrown |
8
1
基本上有两种情况调用析构函数:在函数末尾的堆栈展开(或在异常处),如果某人(或引用计数器)调用了delete。 在静态对象中会发现一种特殊情况——它们在程序结束时通过at_exit被破坏,但这仍然是第二种情况。 哪个信号离开出口通过可能取决于,kill-9将立即终止进程,其他信号将告诉它退出,但具体取决于信号回调。 |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |