C# から呼び出すことができるように、C++ プロジェクトの周りに C++/cli ラッパーを作成しています。C# 側は、CLI メソッド [Put(String^ key, String^ value) など] を何百万回も呼び出して、キー/値管理データの大規模なセットを渡し、続いて別の呼び出し [Commit()] を呼び出して、C++ オブジェクトに要求します。データを使って何かをする。最後の呼び出しまですべてのデータをメモリに保持できる必要があるため、std::vector を使用し、管理されているすべての文字列を管理されていない std::string に変換して、cli のベクトルに保持しようとしています。コード。
私の質問は - このシナリオで管理されたデータを変換する最良の方法は何ですか? 管理されていないポインターを有効に保つために管理されたデータを固定することは、データがすぐに使用されないため、非常に悪い考えのようです (また、関数呼び出しの直後に固定が範囲外になると、これは機能しません。その結果、アクセス違反が発生します)。もう 1 つのオプションは、malloc を使用して「十分な大きさ」のバッファを割り当て、それにデータを追加し続けることです。(1) pin-ptr の後に memcpy が続きます (ピニングは一度 Put メソッドの範囲外になります)。戻り値) 単一の String^ データを変換/コピーする最良の方法は? (2) malloc の合計サイズが事前にわからないので、最初の malloc からメモリを拡張する最良の方法は何ですか? このシナリオの優れた設計ソリューションへのポインタをいただければ幸いです。