2011-10-21 42 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 –

相关问题