2011-10-21 38 views
3

我最近在使用NDK編譯Android控制檯程序時遇到了一個奇怪的問題。什麼時候在NDK中調用全局變量的C++析構函數?

類聲明如下:

class ClassP 
{ 
public: 
    ~ClassP() 
    int number; 
} 
ClassP::~ClassP() 
{ 
    printf("number=%d", number); 
} 

主要功能是這樣的:

// global variable 
ClassP p_instance; 

int main() 
{ 
    printf("test"); 
} 

當執行程序時,它會輸出

test 
Segmentation fault 

經過一番基本的調試,我發現當調用ClassP的析構函數時,它的成員變量的地址le編號是0.我認爲這是因爲p_instance在析構函數被調用之前以某種方式被釋放。但這種行爲並不是我所期望的。當進程退出並且系統試圖釋放所有對象時,是不是調用全局變量的析構函數?

+0

這是C++,使用' cout',而不是'printf',加上'return 0; '在'main'中,初始化'default'構造函數中的''''然後重試。我並不熟悉NDK和android,但它仍然是C++ –

+4

@KirilKirov printf沒有任何問題。 cout的問題在於它依賴於可能在對象之前被解構的對象。 – Pubby

+0

您是否嘗試過使用GCC的'constructor'和'destructor'函數屬性?如果你不能讓你的班級工作,那麼也許那些會。 – Pubby

回答

2

全局變量在其進程關閉時被破壞當它們的模塊/ dll被卸載時。

我假設你的問題是你如何用NDK註冊你的模塊,這聽起來像你的代碼要麼不被聲明爲像你所假設的全局變量(即它實際上被稱爲一個範圍),或者正在加載,卸載模塊,然後以某種方式調用您的函數。

看看SDK中的一些NDK示例,看看你是否在做一些非常基本的錯誤;因爲你的代碼是好的。

+0

感謝您的回覆。我會檢查一些NDK的樣本。順便說一句,代碼在使用Linux的PC上正確運行(由g ++編譯)。 – ccyang

1
class ClassP 
{ 
    public: 
     ~ClassP(); 
     int number; 
}; 
ClassP::~ClassP() 
{ 
    printf("number=%d", number); 
} 

// global variable 
ClassP p_instance; 

int main() 
{ 
    printf("test"); 
} 

添加缺少的分號

後類DEF和類的析構和 和析構函數後運行良好

輸出爲ps = testnumber = 0

+0

@Kiril Kirov - 你無法在默認的構造函數中初始化一個var,這就是爲什麼它的默認構造函數,如果你創建一個構造函數,然後調用它的無參數構造函數。 如果你沒有創建構造函數,那麼C++會爲你創建一個默認的con .. Just FYI –

相關問題