2016-02-09 74 views
-2

我想在類中使用std :: atexit函數進行異常終止清理。 我正在註冊類構造函數內的函數句柄,但得到一個錯誤。 (codetest.cpp:12:25:錯誤:無效的非靜態成員函數使用) 這裏是我理解的簡單代碼(其他這是一個大項目,其中應用程序退出一些致命的錯誤,但我需要清理一些屬性畝類)在類構造函數中調用atexit函數

#include <iostream> 
#include <iomanip> 
#include <stdlib.h> 
using namespace std; 

class cleanUP 
{ 
public: 
    cleanUP() 
    { 
     atexit (atexit_handler); 
    } 
    ~cleanUP() 
    { 

    } 

    void atexit_handler() 
    { 
     // Will cleanup some temp files and malloc things. 
     cout << "Call atexit" <<endl; 
    } 
}; 

int main() { 
    cleanUP cleanup; 
} 

有沒有其他好方法進行清理。 謝謝。

+0

[非法使用非靜態成員函數(在qt中)]的可能重複(http://stackoverflow.com/questions/22749787/invalid-use-of-non-static-member-function-in-qt ) –

回答

0

你的問題是,std::atexit只能從類中註冊一個true(unbound)函數或靜態方法,但不能註冊非靜態方法。

如果你並不需要一個指向對象,最簡單的方法是讓處理器靜:

static void atexit_handler() 
{ 
    // Will cleanup some temp files and malloc things. 
    cout << "Call atexit" <<endl; 
} 

但無論如何,如果你創建一個以上的對象,你會註冊很多次同樣的處理程序至少是無用的。如果你真的想要(或需要)來走那條路,你應該:

  • 確保您使用靜態後衛變量(和一個互斥體或其它關鍵部分,如果你想成爲線程安全的登記處理程序只有一次)
  • 註冊需要在一個標準集裝箱處理的對象將是類的靜態成員
  • 使靜態處理過程中,註冊的對象

但清理的慣用方法是簡單地使用一個析構函數並確保所有動態對象都是在程序退出前正確刪除。