演算子「new」は 1 つのクラスのみの非ローカル ヒープ ポインタを返しますか?
-
26-09-2019 - |
質問
言語 :C++
プラットホーム :Windowsサーバー2003
DLLを呼び出すexeがあります。
編集 :(exe は何も行っていません。DLL 内の DLL に関連するすべての処理を行うグローバル関数をいくつか呼び出します。明示的にはそうではありません 新しい DLL クラスのいずれか)
割り当てます(新しい)の記憶 クラスA DLL 内では、 非ローカルヒープポインタ.
やってみました 新しい DLL 内の他のクラス (DLL 内にある) の場合、「new」はそれらの有効なヒープ ポインターを返します。 クラスA 正しく割り当てられていません。
私はWindowsを使用しており、この関数呼び出しによってヒープを検証しています。
編集:
ClassA* pA = new ClassA();
_CrtIsValidHeapPointer ( (const void *) pA )
なぜこれだけが起こるのか非常に混乱しています 新しい-ing クラスA 他のクラスはありませんか?
(すべてネイティブコード)
最終編集:
それは悪いビルドであることが判明しました。新品では再現できません…これで5日を無駄にしました:'(
解決
[エクスポートのみグローバル関数のDLLと呼び出しのみエクスポート関数からとvテーブルによる。あなたの問題は、唯一のクラス全体をエクスポートしようとによって引き起こされる多くのです。 DLLは.soのライブラリと同じではありません。
EDIT:質問は今のクラスがエクスポートされていないが、これのすべては、他の原因を提案しようとして、単一のDLL内で観察されることが明らかになったので、
同じポインタがテストされているnew
から返された、またはそれがベースサブオブジェクトへのポインタ可能性がありますか?アロケーション使用new
またはnew []
ましたか?これらのいずれかの代わりに、開始のヒープブロックの中央にポイントへのポインタを引き起こす可能性があります。
他のヒント
Class A
の上書きが、その後operator new
場合は、そのクラスのメモリは、CランタイムのDLLのコピーに割り当てることができます。 Cランタイムライブラリのの自分ののバージョンは、DLL内とは異なるヒープを使用しているため、
- 。これは、リターン_CrtIsValidHeapPointer
にfalse
を引き起こします
_CrtIsValidHeapPointer
から返された値は、一般的に信頼できないとにかくです(確かに、それはTRUEを返したとしても、それは必ずしもあなたができるという意味ではありません。の使用のポインタ)。なぜあなたはこのとにかくをしますか?
おそらく、クラスはいくつかの謎の場所からのgetストレージという新しい独自の演算子を宣言?
例えば。クラスの著者は書いたことがあります:
class MyClass {
public:
void * operator new (size_t amt);
void operator delete(void *);
};
そして、そのオペレータの新しいビートあなたのオペレータ新しいます。
こと、または実行可能な用途/ MDながらDLLを/ MTdにして構築されています。