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 = new char[length + 1]; )。

最重要的是,在我尝试重载运算符>>之前,我对这行代码没有任何问题。为了尝试调试它,我已经废弃了该代码。

再次,任何帮助将不胜感激!

4

1 回答 1

0

让我们通过第 18 行:

1. 在第 17 行,您创建了字符串 c,其中包含动态分配的内存。
2. 你做分配:c = a + b:
  2.1。Operator+ 创建本地对象“猫”。
  2.2. cat 的内存是动态分配的。
  2.3. cat 成为两个给定字符串的串联。
  2.4. 操作员+ 退出。cat 是本地对象,它正在被销毁。
    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
}

此外,在处理原始字节(字符)时,您不想使用 new() 和 delete(),而是使用 malloc() 和 free()。在这种情况下,在像 copy() 这样的函数中,您只需使用 realloc(),而不是调用 delete() 然后 new()。

编辑:还有一件事:由堆损坏引起的错误通常发生在调试过程中。在发布二进制文件中,这将简单地覆盖一些已释放(并且可能已经被其他人使用)的内存。这就是为什么调试在 C++ 中使用内存时如此重要的原因。

于 2013-09-24T23:45:32.820 回答