我有一個編碼的功能,當調用全局對象basic_ostream
的析構函數時,將文本輸出到標準輸出。我已經註冊了這個功能在流,但由於某種原因,它不會做任何事情:註冊回調時不輸出
void callback(std::ios_base::event evt, std::ios_base& str, int index)
{
if (evt == std::ios_base::erase_event)
{
std::cout << "Erase event";
}
}
int main()
{
std::cout.register_callback(callback, index());
}
有沒有錯誤/警告,它不輸出任何東西,除非我添加顯式調用析構函數:
std::cout.~basic_ostream<char>(); // "Erase event"
我意識到這樣做是錯誤的,所以我不會把它算作解決方法。我甚至嘗試從緩衝區刷新輸出,但無濟於事。這是爲什麼發生?我在GCC 4.8上運行我的代碼。 Here is a demo.
靜態實例通常在主返回後被銷燬:http://stackoverflow.com/a/2204628/1175253。 我在該處理程序和libstdC++中放置了一個斷點,如果沒有顯式的析構函數調用,它們將不會被擊中。我猜,由於這個實例不是由你的代碼「管理」的,它不僅沒有被刪除,反而只是被刪除了。我似乎無法找到退出處理程序,它在libstdC++中執行任何操作,但是有一個用於刷新的較低級別的IO清理功能。 – Sam