2013-11-03 43 views
2

我有一個編碼的功能,當調用全局對象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.

+0

靜態實例通常在主返回後被銷燬:http://stackoverflow.com/a/2204628/1175253。 我在該處理程序和libstdC++中放置了一個斷點,如果沒有顯式的析構函數調用,它們將不會被擊中。我猜,由於這個實例不是由你的代碼「管理」的,它不僅沒有被刪除,反而只是被刪除了。我似乎無法找到退出處理程序,它在libstdC++中執行任何操作,但是有一個用於刷新的較低級別的IO清理功能。 – Sam

回答

1

您正試圖使用​​std::cout輸出文本,而std::cout正在銷燬?請不要告訴我,這應該工作...

+0

你能證明它不起作用嗎?也許在執行任何其他操作之前調用回調。另外,文檔說析構函數沒有觸及基礎流緩衝區,這意味着它可能工作。 – 0x499602D2