【问题标题】:Getting error while debugging "Debug Error .. Heap corruption detected"调试“调试错误..检测到堆损坏”时出错
【发布时间】:2011-07-25 00:07:37
【问题描述】:

我正在使用 Visual Studio 2005。在调试代码时,我收到以下错误消息,之后它正在添加中断,

调试错误! 程序 :- 检测到堆损坏:在 0x01d21e30 的正常块 c#2368 之后。 CRT 检测到应用程序在堆缓冲区结束后写入内存。

出现上面的错误就行了

delete values[i];

其中values(const wchar_t *) 的向量。

有人知道这个错误是从哪里来的吗?

【问题讨论】:

  • 你是如何分配values[i]的?

标签: debugging visual-c++ exception visual-studio-2005


【解决方案1】:

这肯定是缓冲区写入溢出的结果。这意味着在某些地方,您向缓冲区写入的字符比为其分配的字符多。

您可以使用std::wstring 代替普通缓冲区,这样就无需为您管理缓冲区。验证对缓冲区的每个写入操作。

在删除时检测到溢出,因为堆管理器然后在调试模式下检查缓冲区的开头和结尾处的某些模式。

正如其他人建议的那样,还要注意匹配分配和解除分配:

  • 新建 [] -> 删除 []
  • 新 -> 删除
  • malloc -> free(它是 C 语言,在 C++ 中通常用处不大)

【讨论】:

  • HI @jdehaan :: 我后来注意到在触发删除操作之前 values[i] 的内容是向量值(“Administrator”,“FALSE”)然后我检查了该内存是如何分配的.. i找到了这个administrator=new wchar[sizeof(wchar)*2] 然后我将乘法增加了 2 到 3 ..4 直到 10 并且在 10 时堆错误消失了。现在声明是 administrator=new wchar[sizeof(wchar)*10] ...这是如何解决错误的? .. 管理员的值是“FALSE”... false 需要那么大的大小吗?
  • "FALSE" 至少需要 6*sizeof(wchar_t)(5 个字符 + 一个零终止符)。如果您不想像我之前所说的那样担心内存分配,请考虑使用 wstring。这将使您的生活更轻松,并且是一种比处理裸字符缓冲区更类似于 c++ 的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2017-06-07
  • 2011-04-07
  • 2015-07-03
  • 1970-01-01
相关资源
最近更新 更多