メモリ リークをチェックした後、アプリケーションでこの問題に遭遇し、一部のクラスがまったく破棄されていないことを発見しました。
以下のコードは 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);
}
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
デストラクタが 2 つの考えられるケースのいずれかで呼び出されているように見えますが、これはリンクの順序によって異なります。app_ok を使用すると、正しいシナリオを取得できましたが、app_bug はアプリケーションとまったく同じように動作しました。
この状況で私が見逃している知恵はありますか?事前にご提案いただきありがとうございます。