【发布时间】:2012-09-01 15:04:11
【问题描述】:
在检查内存泄漏后,我在我的应用程序中遇到了这个问题,并发现我的一些类根本没有被销毁。
下面的代码被分成3个文件,它应该实现一个名为pimpl的模式。预期的情况是让Cimpl 构造函数和析构函数都打印它们的消息。然而,这不是我用 g++ 得到的。在我的应用程序中,只有构造函数被调用。
classes.h:
#include <memory>
class Cimpl;
class Cpimpl {
std::auto_ptr<Cimpl> impl;
public:
Cpimpl();
};
classes.cpp:
#include "classes.h"
#include <stdio.h>
class Cimpl {
public:
Cimpl() {
printf("Cimpl::Cimpl()\n");
}
~Cimpl() {
printf("Cimpl::~Cimpl()\n");
}
};
Cpimpl::Cpimpl() {
this->impl.reset(new Cimpl);
}
main.cpp:
#include "classes.h"
int main() {
Cpimpl c;
return 0;
}
这是我能够进一步发现的:
g++ -Wall -c main.cpp
g++ -Wall -c classes.cpp
g++ -Wall main.o classes.o -o app_bug
g++ -Wall classes.o main.o -o app_ok
看起来在两种可能的情况之一中调用了析构函数,这取决于链接顺序。使用 app_ok 我能够获得正确的场景,而 app_bug 的行为与我的应用程序完全一样。
在这种情况下我是否缺少任何智慧? 感谢您提前提出任何建议!
【问题讨论】:
-
有些情况是不调用析构函数的。 This answer 会有所帮助。
-
std::auto_ptr尝试调用Cimpl的析构函数,该析构函数未在“classes.h”中声明。我不确定标准对这种情况有什么要求,但是您可以通过从具有虚拟析构函数并使用基类指针的基类派生Cimpl或手动删除实现实例来解决此问题。 -
我强烈建议您阅读this question 及其讨论的博客文章。涵盖了所有相关问题。
标签: c++ gcc destructor