1

フレームワーク上で実行されるレガシータイプのコードを少し使用しているので、わからないので、下位レベルで何が起こっているのかを実際に説明することはできません。

ただし、私のコードは一連の目標を作成します。

int maxSize = 20;
    myObjects = new Object*[maxSize+1];

    myObjects[0] = new item1(this);
    myObjects[1] = new item2(this);

    for(int i=2; i != maxSize+1; i++){
          myObjects[i] = new item3(this);
        }

    myObjects[maxSize+1] = NULL;

30より大きい場合maxSizeは、これまでに見たことのないエラーが大量に発生します。Visual Studioは、xutilityの強調表示でエラーを作成します。

const _Container_base12 *_Getcont() const
    {   // get owning container
    return (_Myproxy == 0 ? 0 : _Myproxy->_Mycont);
    }

私はこれまでMallocを使用したことがありませんが、ここに問題があります。この問題を回避するために、それを使用して割り当てる必要がありますか?

4

4 に答える 4

5

の絶対値maxSizeはおそらく原因ではありません。30個のポインターを割り当てることは、ほとんどのマイクロコントローラーを含むどのコンピューターでも問題なく実行できるはずです。使用しmallocても何も変わりません。C++で行うことになっている方法で割り当てを行っています。

エラーの原因として考えられるものは次のとおりです。

myObjects[maxSize+1] = NULL;

アイテムにストレージを割り当てmaxSize+1たため、有効なインデックスはとの間0ですmaxSize。最後の要素を1つ超えて書き込むことは未定義の動作であり、クラッシュが発生する可能性があることを意味します。あなたは20の要素で幸運に恵まれましたが、30はあなたのためにこのバグを吸い出しました。ユーティリティを使用すると、現在クラッシュを引き起こしていない場合でも、クラッシュを引き起こす可能valgrind性のあるメモリエラーをキャッチするのに適した方法です。

int maxSize = 20;
myObjects = new Object*[maxSize+1];

myObjects[0] = new item1(this);
myObjects[1] = new item2(this);

// if maxsize is 1, this loop could be trouble
for(int i=2; i != maxSize; i++){
    myObjects[i] = new item3(this);
}

myObjects[maxSize] = NULL;
于 2012-04-24T13:26:31.083 に答える
2

あなたは次のように限界を超えています:

myObjects[maxSize+1] = NULL;

この例では、21個のアイテムを含む配列を作成しました。これは0..20から実行されますが、ここで21番目の要素に書き込もうとしています。

問題はnew/deleteにあるのではなく、ここに切り替える理由もわかりませんmalloc

于 2012-04-24T13:28:34.080 に答える
0

malloc()C++では使用しないでください。を使用する必要がありますnew

これには1つの可能な例外があります。引数として渡す予定のメモリのブロックを、最終的にを使用して解放する関数に割り当てる必要がある場合ですfree()newこのようなブロックを割り当てていた場合free()、ヒープが破損する可能性があります。しかし、これは純粋に架空のものです-私はそのようなAPIを見たことがありません!

于 2012-04-24T13:27:15.997 に答える
0

オフセット「maxSize+1」にはアクセスできないと思います。解決策は次のようなものです。

myObjects = new Object*[maxSize+2];
...
myObjects[maxSize+1] = NULL;
于 2012-04-24T13:32:33.893 に答える