0

ランタイム データ フロー/モデル アナライザー モジュールのメモリ アロケーター/スナップショット コンポーネントに取り組んでいます。私たちの要件の一部は、テスト プログラムのデータ構造を、私たちの管理下にあるカスタム メモリ領域に割り当てることです。回避するために、独自の malloc/frees を定義する必要があると考えたテスト プログラムを変更し、実際のスナップショット/ランタイム チェッカー モジュールは、LD_PRELOADED メカニズムを介して取得したポインターのシステム malloc を使用します (Stackoverflow に感謝します)。しかし、本当の問題は new 演算子にあります。以前と同じルートをたどることができますが、新しい内部で malloc を使用する可能性があります (ただし、これを確認するためにカーネル/libstdc++ コードを確認する必要があります)。モジュール。私が思いついた解決策の 1 つは、何らかの方法で呼び出し元のコンテキストを見つけて、演算子 new をオーバーロードすることでした。(私は通常、C++オブジェクトを作成する<コンストラクターで再帰フラグを設定する>デストラクタでクリアするようなセマンティックを持っています)、コンテキストに基づいてmallocまたはglibc mallocのいずれかを使用してメモリを割り当て、newの配置構文を使用してコンストラクターを確保します呼ばれます。C++コンストラクターが実際にいつ呼び出されるかについてのポインターが本当に欲しいです。そのオブジェクトへのポインターを返すため、それがnewの一部であると90%確信していますが、私が見たnewの唯一の実装( VSCRT )はmallocを使用し、実行します明らかなコンストラクター呼び出しがありません。私の質問は次のとおりです: 1) 私の一般的な考えについてフィードバックが欲しいですか? 2) コンストラクターが正確に呼び出されるのはいつですか? (私は通常、C++オブジェクトを作成する<コンストラクターで再帰フラグを設定する>デストラクタでクリアするようなセマンティックを持っています)、コンテキストに基づいてmallocまたはglibc mallocのいずれかを使用してメモリを割り当て、newの配置構文を使用してコンストラクターを確保します呼ばれます。C++コンストラクターが実際にいつ呼び出されるかについてのポインターが本当に欲しいです。そのオブジェクトへのポインターを返すため、それがnewの一部であると90%確信していますが、私が見たnewの唯一の実装( VSCRT )はmallocを使用し、実行します明らかなコンストラクター呼び出しがありません。私の質問は次のとおりです: 1) 私の一般的な考えについてフィードバックが欲しいですか? 2) コンストラクターが正確に呼び出されるのはいつですか? (私は通常、C++オブジェクトを作成する<コンストラクターで再帰フラグを設定する>デストラクタでクリアするようなセマンティックを持っています)、コンテキストに基づいてmallocまたはglibc mallocのいずれかを使用してメモリを割り当て、newの配置構文を使用してコンストラクターを確保します呼ばれます。C++コンストラクターが実際にいつ呼び出されるかについてのポインターが本当に欲しいです。そのオブジェクトへのポインターを返すため、それがnewの一部であると90%確信していますが、私が見たnewの唯一の実装( VSCRT )はmallocを使用し、実行します明らかなコンストラクター呼び出しがありません。私の質問は次のとおりです: 1) 私の一般的な考えについてフィードバックが欲しいですか? 2) コンストラクターが正確に呼び出されるのはいつですか? 次に、 new の配置構文を使用して、コンストラクターが確実に呼び出されるようにします。C++コンストラクターが実際にいつ呼び出されるかについてのポインターが本当に欲しいです。そのオブジェクトへのポインターを返すため、それがnewの一部であると90%確信していますが、私が見たnewの唯一の実装( VSCRT )はmallocを使用し、実行します明らかなコンストラクター呼び出しがありません。私の質問は次のとおりです: 1) 私の一般的な考えについてフィードバックが欲しいですか? 2) コンストラクターが正確に呼び出されるのはいつですか? 次に、 new の配置構文を使用して、コンストラクターが確実に呼び出されるようにします。C++コンストラクターが実際にいつ呼び出されるかについてのポインターが本当に欲しいです。そのオブジェクトへのポインターを返すため、それがnewの一部であると90%確信していますが、私が見たnewの唯一の実装( VSCRT )はmallocを使用し、実行します明らかなコンストラクター呼び出しがありません。私の質問は次のとおりです: 1) 私の一般的な考えについてフィードバックが欲しいですか? 2) コンストラクターが正確に呼び出されるのはいつですか? 1) 私の一般的な考えについてフィードバックが欲しいですか? 2) コンストラクターが正確に呼び出されるのはいつですか? 1) 私の一般的な考えについてフィードバックが欲しいですか? 2) コンストラクターが正確に呼び出されるのはいつですか?

ベスト、サブラマニアン

4

1 に答える 1

0

new演算子をオーバーロードする場合、コンストラクターの呼び出しではなく、メモリ割り当てプロセスのみをオーバーロードします(これは、によって返されたスペースでコンストラクターを呼び出すために必要なコードを発行することにより、コンパイラーによって行われると思いますnew) -- と同様`delete: 割り当てられたスペースのみを解放します (デストラクタが既に呼び出された後)。

したがって、あなたの質問に対する簡単な答えは、演算子new/deleteをオーバーロードして特定のメモリ割り当てスキームを使用することができ (たとえば、malloc/を介してfree)、オブジェクトの作成は生成された実行可能コードによって処理されるということです。

注:コンストラクターに追加のパラメーターは必要ありません(デストラクタにパラメーターを提供することさえできません)-コンストラクターが呼び出されるまでに、メモリが正常に割り当てられます(そうでない場合、コンストラクターは最初から呼び出されませんでした) )

于 2012-04-10T20:53:22.250 に答える