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

Posted

技术标签:

【中文标题】什么可能导致损坏:正常块错误后?【英文标题】:What could cause DAMAGE: after normal block error? 【发布时间】:2009-04-27 12:57:13 【问题描述】:

在我的应用程序运行 2 天后,我不断收到此错误。

有人告诉我这是某种缓冲区溢出,但这是唯一的选择吗?

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

【问题讨论】:

【参考方案1】:

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

例如:

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

如果您溢出缓冲区,插入的保护会损坏,当您尝试删除缓冲区时,调试器将在检测到缓冲区溢出后断言。

在大型代码库中查找缓冲区溢出有点困难。我会建议几种方法来帮助您检测这种情况:

使用Rational Purify: 等工具 它是检测内存损坏的好工具。 Windbg 使用 GFlags 调试 启用: 在此处将我的answer 转至类似问题

【讨论】:

请参考我对其他答案的评论。感谢您的帮助。【参考方案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;

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

【讨论】:

【参考方案3】:

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

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

不过,赔率是超支。

【讨论】:

以上是关于什么可能导致损坏:正常块错误后?的主要内容,如果未能解决你的问题,请参考以下文章

Linux非正常关机后系统文件错误,导致无法进入系统。如何修正这些错误?

pcmask磁盘错误

au为啥加载音频错误

Win7电脑开机无法正常启动怎么办

出现错误 ORA-01578: ORACLE 数据块损坏 (文件号 1, 块号 61338)

电脑开机或重启都显示 加载操作系统错误 该怎么办?