編集:明らかに、質問は明確に定式化されていません。私が抱えている問題は、デストラクタがヘッダーで定義されている場合、複数の .obj ファイルに追加され、リンカが文句を言うことです。実際の質問は次のとおりです。
DLL プロジェクトの CPP ファイルにデストラクタを追加し、動的読み込みとインターフェイス ヘッダー ファイルで dll を使用すると、メモリ リークを防ぐためにベース デストラクタが呼び出されますか?
MSVC 10.0 を使用しており、インターフェイスを実装する DLL プロジェクトがあります。インターフェイスは、抽象 (純粋仮想) 基本クラスです。アイデアは、ヘッダーがライブラリの動的ロードで使用されるということです。したがって、純粋な仮想デストラクタを使用して、基本クラスのデストラクタが確実に呼び出されるようにしました。これを説明するサンプル コードを次に示します。
//ISplitter.h
#pragma once
struct param {
int something;
}
class ISplitter {
public:
virtual ~ISplitter() = 0;
virtual void useful() = 0;
}
ISplitter::~ISplitter() {
/* Make sure base class destructor gets called */
}
そして、メインの実装ヘッダー
//CSplitter.h
#pragma once
#include "CHelper.h"
#include "ISplitter.h"
class CSplitter : public ISplitter {
private:
CHelper hlp;
public:
~CSplitter();
void useful();
}
一部のヘルパー クラス
//CHelper.h
#pragma once
#include "ISplitter.h" // I need the struct
// Class definition should go here but is irrelevant
ここでの問題は、リンカがデストラクタに通知するエラーを生成することです。ISplitter::~ISplitter(void) が複数宣言されており、システムがビルドされません。エラー:
CHelper.obj : error LNK2005: "public: virtual __cdecl ISplitter::~ISplitter(void)" (??1ISplitter@@UEAA@XZ) already defined in CSplitter.obj
これを修正する正しい方法は何ですか? ISplitter.cpp にデストラクタを配置しましたが、ライブラリを動的にロードして基本クラスを ISplitter にアップキャストすると、これが機能しないのではないかと心配しています。