0

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 からメモリを拡張する最良の方法は何ですか? このシナリオの優れた設計ソリューションへのポインタをいただければ幸いです。

4

1 に答える 1

1

データを使用する前にキューに入れる必要がある場合は、おそらく管理されたコンテナーを使用してそれを行うでしょう。2 つの文字列を「キー」と「値」と呼びましたが、キーは一意ですか? その場合は、マネージド を使用しDictionary<String^, String^>ます。そうでない場合は、 を使用しList<KeyValuePair<String^, String^>>、Commit() が呼び出されたときにすべての変換をアンマネージ文字列に行います。

Commit() が呼び出されると、1 つの大きな malloc を実行してすべての個々の文字列を保持するか、多数の個別の malloc (または他の割り当て方法) を使用して各文字列を個別に変換できます。すべての場合でメモリを適切に解放する限り、どちらも正常に機能するはずです。

于 2012-07-31T00:20:58.717 に答える