什么时候在NDK中调用全局变量的C ++ Destructor?

时间:2011-10-21 09:29:39

标签: android c++ global-variables destructor android-ndk

我最近在使用NDK编译Android控制台程序时遇到了一个奇怪的问题。

该类声明如下:

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的析构函数时,其成员变量号的地址为0.我认为这是因为在调用析构函数之前,某种方式释放了p_instance。但这种行为并不是我的预期。当进程退出并且系统试图释放所有对象时,是不是调用了全局变量的析构函数?

2 个答案:

答案 0 :(得分:2)

当他们的进程在卸载模块/ dll时关闭时,会破坏全局变量。

我假设您的问题在于如何使用NDK注册模块,听起来您的代码要么不像您假设的那样被声明为全局变量(即它实际上被调用到范围内) ),或者正在加载,卸载模块,然后以某种方式调用你的函数。

看看SDK中的一些NDK示例,看看你是否做了一些非常基本的错误;因为你的代码很好。

答案 1 :(得分:1)

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

// global variable
ClassP p_instance;

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

添加缺少的分号

课后def和课后析构函数和 并且析构函数运行良好

Ps output = testnumber = 0