2011-10-21 9 views
3

NDKを使用してAndroidコンソールプログラムをコンパイルしているときに、最近奇妙な問題が発生しました。グローバル変数のC++デストラクタはいつNDKで呼び出されますか?

クラスはこのように宣言されています

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のデストラクタを呼び出すと、そのメンバ変数のアドレス私が思うのは、デストラクタが呼び出される前にp_instanceが解放されたからです。しかし、その行動は私が期待したものではありません。プロセスが終了してシステムがすべてのオブジェクトを解放しようとしているときに、グローバル変数のデストラクタが呼び出されていませんか?

+0

これは、 'C++、使用することですcout'、 'printf'の代わりに' return 0; 'を' main'の中で 'default'コンストラクタで' number'を初期化して、もう一度やり直してください。私はNDKとアンドロイドに精通していませんが、まだC++です –

+4

@KirilKirov printfに何も問題はありません。 coutの問題は、オブジェクトの前に解体されている可能性のあるオブジェクトに依存していることです。 – Pubby

+0

GCCの 'constructor'と' destructor'関数属性を使ってみましたか?あなたのクラスがうまく動作しない場合、おそらくそれらのことが起こります。 – Pubby

答えて

2

グローバル変数は、そのモジュール/ dllがアンロードされたときに、プロセスがまたはを閉じると破壊されます。

モジュールをNDKにどのように登録しているかで問題はあると思いますが、コードがグローバル変数として宣言されていない(つまり、実際にスコープ)、またはモジュールがロードされていて、アンロードされている場合、関数が何とか呼び出されます。

SDKのNDKサンプルのいくつかを見て、非常に基本的なやり方が間違っているかどうかを確認してください。それはあなたのコードが立っているので大丈夫です。

+0

ご返信ありがとうございます。私はNDKのいくつかのサンプルをチェックします。ところで、コードはLinux(g ++でコンパイルされた)を使用しているPCで正しく動作します。 – 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を初期化することはできません。そのため、コンストラクタを作成した後にno-argsコンストラクタを呼び出すと、そのデフォルトのコンストラクタが使用されます。 コンストラクタを作成しないと、C++でデフォルトのconを作成します。 –

関連する問題