0

だから、私はこれまでにこれを経験したことがありません。通常、エラーが発生すると、常にブレークポイントがトリガーされます。ただし、今回はソリューションをビルドしてデバッグなしで実行すると (ctrl + F5)、エラーは発生せず、正しく実行されます。しかし、デバッグしようとすると (F5)、次のエラーが表示されます。

HEAP[MyString.exe]: HEAP: Free Heap block 294bd8 modified at 294c00 after it was freed
Windows has triggered a breakpoint in MyString.exe.

This may be due to a corruption of the heap, which indicates a bug in MyString.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while MyString.exe has focus.

The output window may have more diagnostic information.

この課題は今夜が期限なので、手短に助けていただければ幸いです。

私のコードはここにあります: https://gist.github.com/anonymous/8d84b21be6d1f4bc18bf

問題を main.cpp の 18 行目に絞り込みました ( c = a + b; ) 連結は成功しますが、それを c にコピーすると、MyString の 56 行目でエラー メッセージが表示されます。 cpp ( pData = 新しい文字 [長さ + 1]; ).

キッカーは、演算子>> のオーバーロードを試みるまで、このコード行で問題が発生しなかったことです。これをデバッグするために、そのコードを破棄しました。

繰り返しますが、助けていただければ幸いです。

4

1 に答える 1

0

18行目を見てみましょう:

1. 17 行目で、内部に動的に割り当てられたメモリを持つ文字列 c を作成します。
2. 次の代入を行います: c = a + b:
  2.1. Operator+ は LOCAL オブジェクト 'cat' を作成します。
  2.2. cat のメモリは動的に割り当てられます。
  2.3. cat は、与えられた 2 つの文字列の連結になります。
  2.4. Operator+ が終了します。cat は LOCAL オブジェクトであり、破棄されています。
    2.4.1. 猫が破壊されています。cat のデストラクタが実行されます。
    2.4.2. デストラクタは pData を削除します。
    2.4.3. 削除後、*pData = NULL にします。//エラー - pData = NULL (1) である必要があります
  2.5。c は operator+ の結果で初期化されます。
  2.6. operator= は copy() を呼び出します。
  2.7. copy() は、現在のメモリをチェックせずに新しいメモリを割り当てます。//エラー - メモリ リーク (2)

(1) pData は char* です。デストラクタには、delete[] pData (メモリを削除) と *pData = NULL があります。pData はポインタなので、*pData は pData[0] と同じです。したがって、すでに解放されているメモリに書き込みます。これがエラーの原因です。

(2) 追加の問題。Copy() は、現在のメモリをチェックせずに上書きします。次のようにする必要があります。

copy()
{
    if(this->pData)
    {
        delete this->pData;
    }
    //now allocate new buffer and copy
}

また、生のバイト (chars) を扱うときは、new() と delete() を使用するのではなく、代わりに malloc() と free() を使用します。この場合、copy() のような関数では、delete() を呼び出してから new() を呼び出す代わりに、単純に realloc() を使用します。

編集: もう 1 つ: ヒープの損傷によるエラーは通常、デバッグ中に発生します。リリース バイナリでは、解放された (他の誰かが既に使用している可能性がある) メモリを単純に上書きします。そのため、C++ でメモリを操作する場合、デバッグが非常に重要になります。

于 2013-09-24T23:45:32.820 に答える