1

これが状況です。

クラスがあります

Class L_FullQuote
{
    private:
    vector<int> time;
    ..
}

Class B
{

    L_FullQuote *Symbols[100];

    void handle message()

}

内部ハンドル msg 私はこのステートメントを持っています

Symbols[i]->time.push_back(2);

コードは正常にビルドされます..しかし、生成されたdllを使用すると. アプリケーションがクラッシュするだけです.時々、ベクトルでnxt poinerエラーが発生します..しかし、ほとんどの場合、アプリケーション全体がクラッシュします. その行がなくても問題なく動作します。

助けてください

ありがとう

4

3 に答える 3

2

すでに使用してvectorいるので、さらに一歩進んでみませんか?を使用std::vectorすると、メモリ管理について心配することなく、機能の記述に集中できます。

この例は、最初に投稿したものとは少し異なります。元の質問クラスBには100個のポインターの配列があり、それぞれを初期化する必要があります。以下の例では、コンストラクターで最初に100オブジェクトにサイズ設定されたオブジェクトstd::vectorのを作成します。L_FullQuote

class L_FullQuote
{
public:
    vector<int> time;
};

class B
{
public:
    // Initialize Symbols with 100 L_FullQuote objects
    B() : Symbols(100)
    {
    }

    std::vector<L_FullQuote> Symbols;

    void handle_message()
    {
       Symbols[i].time.push_back(2);
       // other stuff...
    }

};
于 2012-06-28T18:24:16.897 に答える
1
L_FullQuote *Symbols[100];

ここでは へのポインターの配列を宣言L_FullQuoteしますが、ポインターを初期化しないため、次のように呼び出します。

Symbols[i]->...

無効なポインターを逆参照しています。また、private として宣言したことにも注意してくださいtime(ただし、コードはこの方法でコンパイルすることさえできませんが、B は AI の味方だと思いますか?)

ポインターの配列を宣言するだけでは、各要素が有効なオブジェクトを指すように初期化されません。次のように、それぞれを初期化する必要があります。

for(int i = 0; i < 100; ++i) {
    Symbols[i] = new L_FullQuote();
}

そうして初めて、有効なポインターでいっぱいの配列が得られます。ただし、それらの割り当てを解除することを忘れないでください!

于 2012-06-28T18:22:21.277 に答える
-1

時間はクラスL_FullQuoteのプライベートメンバーであり、クラスBからはそのフィールドにアクセスできません

于 2012-06-28T18:24:33.227 に答える