【问题标题】:When will C++ Destructor for a global variable be called in NDK?什么时候在 NDK 中调用全局变量的 C++ 析构函数?
【发布时间】:2011-10-22 00:07:45
【问题描述】:

我最近在使用 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在调用析构函数之前被某种方式释放了。但行为不是我所期望的。进程退出,系统试图释放所有对象时,不是调用全局变量的析构函数吗?

【问题讨论】:

  • 这是 C++,使用cout,而不是printf,在main 中添加return 0; ,在default constructor 中初始化number,然后重试。对NDK和android一点都不熟悉,不过还是C++
  • @KirilKirov printf 没有问题。 cout 的问题在于它依赖的对象可能在你的对象被解构之前就被解构了。
  • 您是否尝试过使用 GCC 的 constructordestructor 函数属性?如果你不能让你的班级开始工作,那么也许那些会。

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


【解决方案1】:

全局变量在它们的进程关闭时被破坏在它们的模块/dll被卸载时。

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

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

【讨论】:

  • 感谢您的回复。我会检查一些 NDK 的样本。顺便说一句,代码在使用 Linux(由 g++ 编译)的 PC 上正确运行。
【解决方案2】:
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

【讨论】:

  • @Kiril Kirov - 你不能在默认构造函数中初始化 var,这就是为什么它是默认构造函数,如果你创建一个构造函数,那么它被称为无参数构造函数。如果您不创建构造函数,则 C++ 会为您创建一个默认配置。仅供参考
猜你喜欢
  • 1970-01-01
  • 2013-10-09
  • 2019-11-15
  • 2019-04-07
  • 1970-01-01
  • 2010-09-15
  • 2021-02-16
  • 2015-07-27
相关资源
最近更新 更多