什么可能导致损坏:正常阻塞错误后?

时间:2009-04-27 12:57:13

标签: c++ visual-c++

我的应用程序运行2天后,我一直收到此错误。

我被告知它是某种缓冲区溢出,但它是唯一的选择吗?

该应用程序是使用Visual C ++ 6.0以C ++编写的。

3 个答案:

答案 0 :(得分:2)

重现这个的最简单方法是这样的:

//Allocate space for holding 10 ints
int *p = new int[10];

//Overwrite the memory.. doesn't crash here
p[10] = 8;

//Try to delete..crashes..
delete[] p;

检查是否要写入超出其分配空间的内存位置。

答案 1 :(得分:2)

在调试中,当您通过new获得动态缓冲区时,会在缓冲区之前和之后插入一个特殊代码来保护缓冲区。

例如:

<Guard>=====buffer allocated on heap of required size=======<Guard>

如果超出缓冲区,插入的防护已损坏,当您尝试删除缓冲区时,调试器将在检测到缓冲区溢出后置位。

在大型代码库中很难找到缓冲区溢出。我会建议几种可以帮助您检测这种情况的方法:

  • 使用Rational Purify等工具:
          它是检测内存损坏的好工具。
  • Windbg使用GFlags进行调试 启用: 请参阅我的answer类似问题

答案 2 :(得分:0)

使用正确的选项,Visual C ++会在每个缓冲区的末尾抛出一个保护值。释放缓冲区时,它会检查它是否仍然有效。如果没有,它会引发您所看到的错误。

此错误的最常见原因是缓冲区溢出。但是,它(理论上)可以由随机指针写入引起(毕竟,可以写入保护值)。

然而,赔​​率是超支。