0

構造体でそれらにアクセスするときに、stdコンテナーのベクター、マップ、およびマルチマップ(私が試したもののみ)に書き込むことができないようです。これが私がやろうとしていることの例です:

struct B
{
    void* pp;
};

struct A
{
    std::vector< B* > veEvents;
};

どこかのクラス関数で

A* d = new A;

B* f = new B;
d->veEvnts.push_back( f );  //<< this line crashes 

この方法でコンテナにアクセスしようとすると、STDがクラッシュします。このポインタを防御している行のSTDコードでクラッシュします。ベクトルステートメントのtypedefを含むいくつかの回避策を試しましたが、うまくいきませんでした。回避策として有望と思われるのは、構造体の中に関数を入れて関数を呼び出すことでした...

struct B
{
   void* pp;
};

struct A
{
    void K( B* f )
    {
        static std::vector< B* > veEvents;

        veEvnts.push_back( f );  //<< this line crashes 
    }
};

一部のクラス関数で

A* a = new A;
B* b = new B;
a->K(b);   //This seems to work.

構造体内で宣言されたコンテナにアクセスするとアクセスの問題が発生するという最初の問題を回避する方法はありますか?

4

2 に答える 2

1

わかった!その底に着きました。Ivaylo は、スタックの破損については正しかった。問題のポインターは、クラスのメンバー変数領域のベクトルを指していました。ベクトルは最初にそこに作成され、ヒープ上の同じ構造体型の別の構造体にコピーされましたが、ベクトルはまだクラス スタックを指していました。ディープコピーを書いてみましたが、別のクラスからのものです。それはうまくいきませんでした。そのため、最初からヒープに構造体を作成し、それを使用して最初のパスで変数を保存しました。その後、ヒープ上の構造体を使用して、別のクラスでベクターへのアクセスが機能します。元の構造体は、そもそもそのように作成されているはずです。みんなありがとう。皆様のご協力に感謝いたします。

于 2013-03-20T23:47:35.487 に答える
0

それはクラス 'B' の完全なコードですか? はいの場合、貼り付けたコードに明らかな問題はありません。「いいえ」の場合、クラッシュにつながる可能性のあるシナリオの 1 つとして次のことが考えられます。

  1. クラス B は、新しいオブジェクトの作成中に *pp にメモリを割り当てますが、コピー中は同じことを行いません (つまり、コピー コンストラクターでの浅いコピー)。

  2. オブジェクトをベクターに挿入すると、コピー コンストラクターが呼び出され、オブジェクトがベクター メモリ空間にコピーされます。浅いコピーのため、挿入されたオブジェクトとベクトル内の対応するオブジェクトの両方が、pp が指す同じポインターを共有します。

  3. オブジェクトはスコープ外になり、デストラクタは pp が指すメモリを削除します。このオブジェクトの対応するベクトルはまだこのメモリを指しており、どこかにアクセスしようとしています。

静的参照を介して同じことをしようとすると、削除は行われません (静的オブジェクトはスコープ外になると削除されません)。ベクター内のオブジェクトと対応するオブジェクトの両方が有効なメモリを指し続け、クラッシュは発生しません。

于 2013-03-20T11:10:27.037 に答える