在检查内存泄漏后,我在我的应用程序中遇到了这个问题,并发现我的一些类根本没有被破坏。
下面的代码分为 3 个文件,它应该实现一个名为pimpl的模式。预期的情况是让Cimpl
构造函数和析构函数都打印它们的消息。然而,这不是我用 g++ 得到的。在我的应用程序中,只有构造函数被调用。
类.h:
#include <memory>
class Cimpl;
class Cpimpl {
std::auto_ptr<Cimpl> impl;
public:
Cpimpl();
};
类.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);
}
主.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 的行为与我的应用程序完全一样。
在这种情况下,我是否缺少一点智慧?感谢您提前提出任何建议!