我有一個用戶定義的析構函數的類。如果最初實例化類,然後在程序運行時發出SIGINT(在unix中使用CTRL + C),那麼將調用析構函數嗎? SIGSTP的行爲是什麼(unix中的CTRL + Z)?是否在SIGINT或SIGSTP發佈時調用析構函數?
回答
不,默認情況下,大多數信號會導致程序立即異常退出。
但是,您可以輕鬆更改大多數信號的默認行爲。
這段代碼演示瞭如何使一個信號,退出你的程序正常,包括調用所有常見的析構函數:
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <cstring>
#include <atomic>
std::atomic<bool> quit(false); // signal flag
void got_signal(int)
{
quit.store(true);
}
class Foo
{
public:
~Foo() { std::cout << "destructor\n"; }
};
int main(void)
{
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_handler = got_signal;
sigfillset(&sa.sa_mask);
sigaction(SIGINT,&sa,NULL);
Foo foo; // needs destruction before exit
while (true)
{
// do real work here...
sleep(1);
if(quit.load()) break; // exit normally after SIGINT
}
return 0;
}
如果你運行這個程序,並按下控制-C,你應該看到「析構函數」打印。請注意,除非您真的知道您在做什麼,否則您的信號處理函數(got_signal)應該很少做任何工作,除非設置標誌並安靜地返回。
大多數信號如上所示是可捕獲的,但不是SIGKILL,您無法控制它,因爲SIGKILL是殺死失控進程的最後一種方法,而不是SIGSTOP,它允許用戶凍結進程冷卻。請注意,如果需要,您可以捕獲SIGTSTP(control-Z),但如果您對信號的唯一興趣是析構函數行爲,則不需要,因爲最終在控制-Z過程將被喚醒後,將繼續運行,並且將正常退出所有的析構函數。
如果你自己不處理這些信號,那麼,不,不會調用析構函數。但是,操作系統將在程序終止時回收您的程序使用的任何資源。
如果您希望自己處理信號,請考慮檢查sigaction
標準庫函數。
回收操作系統擁有的資源。在一個應用程序中還有其他的資源,它們通常以這樣一種方式包裝,即正確關閉它們(否則你會得到損壞的資源(如未正確終止的文件))。 – 2010-11-22 23:24:24
讓我們試一下:
#include <stdio.h>
#include <unistd.h>
class Foo {
public:
Foo() {};
~Foo() { printf("Yay!\n"); }
} bar;
int main(int argc, char **argv) {
sleep(5);
}
然後:
$ g++ -o test ./test.cc
$ ./test
^C
$ ./test
Yay!
所以恐怕不行,你必須抓住它。
至於SIGSTOP
,它不能被捕獲,並暫停處理,直到發送一個SIGCONT
。
- 1. 析構函數是否自動調用
- 2. 在C++中捕獲SIGINT和調用析構函數的程序結構
- 3. STL Vector是否調用未分配對象的析構函數?
- 4. 在析構函數中發出sigC++信號是否安全?
- 5. 如何找出構建是否調試或發佈
- 6. 在VS 2010中調試時未調用析構函數
- 7. CoffeeScript是否有類析構函數?
- 8. VB6類是否具有析構函數?
- 9. 默認構造函數和析構函數是否內聯?
- 10. 基類的構造函數和析構函數是否使用派生函數調用?
- 11. 在MFC中當調用EndDialog()時,類的析構函數什麼時候觸發?
- 12. 成功調用析構函數或調用empy析構函數後出現Seg錯誤。 C++
- 13. 什麼時候使用QTimer調用多個函數調用的析構函數?
- 14. 如果函數返回提前或拋出異常,是否會調用對象的析構函數?
- 15. 析構函數被調用的東西不是構造的
- 16. 這是否是我的Node結構的正確析構函數?
- 17. 何時在WCF服務中調用析構函數
- 18. Modal View析構函數在InputAccessoryView被覆蓋時未被調用
- 19. 什麼時候在C++中調用析構函數?
- 20. Botan :: SecureVector - 構造函數中調用的析構函數?
- 21. 複製構造函數調用析構函數C++
- 22. 成員構造函數和析構函數調用的順序
- 23. emplace_back調用移動構造函數和析構函數
- 24. 外部調用拷貝構造函數和析構函數
- 25. 載體構造函數/析構函數調用
- 26. std :: for_each()並調用構造函數/析構函數
- 27. 是否需要調用std構造函數的調用?
- 28. 析構函數調用兩次
- 29. C++析構函數沒有被調用?
- 30. C++析構函數和調用順序
IIRC,`quit`的正確類型應該是`volatile std :: sig_atomic_t`。爲此目的使用`bool`是UB。 – MSalters 2010-11-23 09:29:36