2

C++ サーバーと通信する C++ ライブラリ アプリがあり、カスタム クラス オブジェクトのベクトルを作成しています。しかし、私の Cpp/CLI コンソール アプリ (ネイティブ C++ と対話する) は、カスタム クラスの obj ベクトルを返そうとすると、メモリ違反エラーをスローします。

コードサンプル -

私のネイティブ C++ クラスでは -

std::vector<a> GetStuff(int x)
{
   -- do stuff
   std::vector<a> vec;
   A a;
   vec.push_back(a);
--- push more A objs
   return vec;
}

私のCpp/CLIクラスで

public void doStuff()
{
   std::vector<a> vec;
   vec = m_nativeCpp->GetStuff(4);   // where nativeCpp is a dynamically allocated class in nativecpp DLL, the app throws up a memory violation error here!
}

正確なエラーメッセージ

タイプ 'System.AccessViolationException' の未処理の例外が CLIConsole.exe で発生しました -- これは私のコンソール cpp/CLI プロジェクトです

追加情報: 保護されたメモリの読み取りまたは書き込みを試みました。これは多くの場合、他のメモリが破損していることを示しています。

4

3 に答える 3

2

このサポート記事をご覧ください。何が起こっているのかというと、CLIのベクターがDLLから内部ベクターデータにアクセスしようとしますが、静的変数が異なるためにアクセスできません。&vector[0]唯一の良い解決策は、DLLの境界を介して単純な配列を渡し、それを返すことだと思います。

しかし、Aクラスのコピーコンストラクターでもいくつかの魔法が起こっている可能性があります。それらが欠落していて、クラスにメンバーとしてのポインターがある場合、同じエラーが簡単に発生する可能性があります。

于 2009-02-04T03:30:48.797 に答える
0

よくわかりませんが、これでうまくいく可能性があります。ベクトルを返す代わりに、ヒープ上にベクトルを作成して、そのベクトルへのポインタを返します。

于 2009-02-04T02:41:19.583 に答える