2

オブジェクトの1つで、画像データを格納するための符号なし文字配列メンバーを作成します。

    unsigned char* imageData;

コンストラクターで、newで初期化します。

    MyObject::MyObject()
    {
        int imageSize = 6054400;
        imageData = new unsigned char[imageSize];
    }

imageDataは、ループの過程全体でいっぱいになります。

このオブジェクト(MyObject)はループの最後まで削除されませんが、ループの途中でimageDataを削除する必要があります。だから私はちょうどこの関数を作成しました:

    void MyObject::DeleteAllMembers
    {
        delete [] imageData;
    }

そして私はそれをループの終わりに呼びます:

    theObj.DeleteAllMembers();

問題は、プログラムがコード行に到達するたびに、次のことです。

    delete [] imageData;

クラッシュし、次のエラーメッセージが残ります。

エラー

この時点で、なぜこれが起こっているのかわかりません。

私が試したことのいくつかは次のとおりです。

  • imageSizeだけでなくimageSize+1でimageDataを初期化する
  • 削除コマンドをデストラクタに移動し、ループを実行するたびにオブジェクトを手動で削除します
  • delete [] imageDataの代わりにdeleteimageDataを使用しますが、delete[]を使用する必要があると確信しています。
  • 削除してみましたがimageData = 0、残念ながらプログラムがクラッシュしdelete [] imageDataます。
  • を使用してみましmemset(&imageData, 0, imageSize);たが、アクセス違反エラーが発生しました。

毎回、プログラムは同じ行でクラッシュします。誰かが私のコードを見て、「あなたはモロン、あなたがしなければならないのは____________________だけです」と思っていることを知っています。誰かが私が間違っていることを教えてもらえますか?

編集:申し訳ありませんが、私は何か間違ったことを言いました。ループの開始時に毎回このオブジェクトを作成し、ループの終了時に削除されます。プログラムの最初と最後になぜ言ったのかわかりません。

4

5 に答える 5

5

同じポインタが複数回削除されるのを防ぐために、少し追加することをお勧めします。

void MyObject::DeleteAllMembers
{
    delete [] imageData;
    imageData = 0; // <-- here
}
于 2013-02-11T14:25:14.107 に答える
3

は?

オブジェクトの作成時に(を使用して)割り当てるだけの場合、ループ内で複数回割り当てるnew[]ことはできません。delete[]あなたは一度だけdelete[]何かをすることができます、同じポインタをdelete[]再びに渡すことは失敗します。

また、それは意味がありません。オブジェクト構築時に配列を1回だけ作成する場合、なぜそれを複数回破棄する必要があるのでしょうか。

于 2013-02-11T14:22:46.010 に答える
1

バッファを再利用する必要がある場合は、ループ内でバッファを削除するのではなく、バッファをリセットしてください。たとえば、memset を使用します。

memset(&imageData, 0, imageSize);

その後、不要になったら削除してください。

于 2013-02-11T14:33:47.053 に答える
0

あなたの質問は少し不明確ですが、いくつかのポイント:

  • 「imageData」が「MyObject」のメンバーである場合、なぜその破壊が外部の「MyObject」から明示的に管理されているのですか?

  • 「ループ」の各反復で「imageData」が破棄された場合は、再度使用 (および破棄) する前に、再度作成する必要があります。

  • 「ループ」ってどこ?「MyObject」のメンバーである関数内にあるか、「imageData」の管理方法を変更しない場合

  • サイズが変化している場合は、「ループ」の反復ごとに配列を削除して再割り当てするだけで済みます。

  • 「imageData」が「ループ」の範囲内で作成および破棄される場合、なぜそれがクラスメンバーになるのでしょうか?

于 2013-02-11T14:37:44.013 に答える
0

あなたは3 つのルールに違反したのではないかと思います。

この問題の最善の解決策は、たとえば を使用して完全に回避することstd::vectorです。「ゼロのルール」を参照してください。

class MyObject 
{
  std::vector<unsigned char> imageData;
  ...
};

MyObject::MyObject() : imageData(6054400) {}

void MyObject::DeleteAllMembers
{
  imageData.resize(0);
}
于 2013-02-11T14:49:40.500 に答える