5

test.dll などのプロジェクト (dll を作成する) がありますが、クラスのコンストラクターとデストラクタ (TestClass など) を dll にエクスポートしていません。これは、TestClass のオブジェクトを作成および破棄するために呼び出されるはずのファクトリ関数がいくつかあるためです。この設計は、test.dll から TestClass のオブジェクトを使用しようとして作成したスタンドアロンの例では完全に正常に機能します。

ただし、この test.dll (または、Visual Studio を使用しているため、私の場合は .lib) を製品モジュールのプロジェクトにリンクすると、TestClass で見つからないコンストラクターとデストラクタを指す奇妙なリンク エラーが発生します。私は、new / delete を呼び出したり、プロジェクト内のどこにも TestClass のスタック インスタンスを作成したりしないことを知っています。製品モジュールは、C#/CLR/CLI と C++ を使用していると思います。回避する唯一の方法は、TestClass のコンストラクターとデストラクターをエクスポートすることです。これは設計上望ましくありません。

この状況は誰にでもなじみがありますか?何が問題なのか指摘できますか?

これは私が得るエラーです:

Error   5264    error LNK2028: unresolved token (0A000BA3) "public: virtual __thiscall BE::TestClass::~TestClass(void)" (??1TestClass@BE@@$$FUAE@XZ) referenced in function "public: virtual void * __thiscall BE::TestClass::`vector deleting destructor'(unsigned int)" (??_ETestClass@BE@@$$FUAEPAXI@Z)  AMBestDetailBridge.obj  BEBase

Error   5373    error LNK2001: unresolved external symbol "public: virtual __thiscall BE::TestClass::~TestClass(void)" (??1TestClass@BE@@$$FUAE@XZ) AMBestDetailBridge.obj  BEBase

ありがとう!

4

1 に答える 1

1

リンク エラーは、delete [] を介してデストラクタを呼び出していることを示しているため、本番モジュールに特定のコードがある可能性が最も高いです。

TestClass* pTest = ...
delete pTest;
TestClass* pTestArray = ...
delete[] pTest;

もちろん、スマート ポインターの場合は、それほど明白ではない可能性があります。

SmartPtr<TestClass> spTest = ...
// delete called automatically when out of scope.

あるモジュールで割り当て、別のモジュールで削除すると、潜在的なリスクにさらされます.2つのモジュールはメモリ割り当てに異なるヒープを使用する可能性があるため(新しい演算子を再定義するとします)、この問題が実行時ではなくリンク時に明らかになるのは幸運です.

于 2012-08-17T15:30:26.167 に答える