0

C ランタイム ライブラリにあるメモリ管理関数をオーバーライドするサード パーティの API を使用しています。すべてが適切に機能するためには、メモリ割り当てが行われる前に API を初期化する呼び出しを行う必要があります。

私が取り組んでいるプロジェクトでは、メイン ファイル内のコードが実行される前に動的に初期化される静的 Factory オブジェクトを使用しています。

静的 Factory オブジェクトの前に API が初期化されるようにするにはどうすればよいですか?

4

2 に答える 2

6

C++ 標準ライブラリでも同じ問題が発生します。静的オブジェクトのコンストラクターを含むコードがそれらを使用する前にcin、 、 などを確実に初期化する必要があります。coutこの状況を処理するために考案されたトリックは、あなたの問題も解決できます。すべての翻訳単位 (つまり、動的初期化子を持つ静的オブジェクトを持つすべての翻訳単位)に最初に含まれるヘッダー ファイル:

class init_library {
public:
    init_library() { if (counter++ == 0) initilaize_the_library(); }
private:
    static int counter;
};

static init_library i_library;

そして、1 つの翻訳単位で の定義を提供する必要がありinit_library::counterます。

init_libraryこれにより、ヘッダーを取得するすべての翻訳単位にタイプの静的オブジェクトが配置されます。その初期化は、同じ翻訳単位内の他のどの初期化よりも前に行われます (その #include ディレクティブが最初にあるため、忘れないでください!)。これらのオブジェクトの 1 つが初めて初期化されると、初期化するコードが呼び出されます。図書館。(このコードはスレッドセーフではないことに注意してください。スレッドセーフにするのは簡単です)

これは「気の利いたカウンタートリック」として知られています。

于 2012-09-13T15:40:35.470 に答える
5

静的ファクトリ オブジェクトの初期化を静的関数に移動し、メインで最初にサードパーティ ライブラリを初期化した後にその関数を呼び出す必要があります。

于 2012-09-13T14:40:40.580 に答える