【发布时间】:2009-04-27 12:57:13
【问题描述】:
在我的应用程序运行 2 天后,我不断收到此错误。
有人告诉我这是某种缓冲区溢出,但这是唯一的选择吗?
该应用程序是使用 Visual C++ 6.0 以 C++ 编写的。
【问题讨论】:
标签: c++ visual-c++
在我的应用程序运行 2 天后,我不断收到此错误。
有人告诉我这是某种缓冲区溢出,但这是唯一的选择吗?
该应用程序是使用 Visual C++ 6.0 以 C++ 编写的。
【问题讨论】:
标签: c++ visual-c++
在调试中,当您通过new 获取动态缓冲区时,会在缓冲区前后插入一个特殊代码来保护缓冲区。
例如:
<Guard>=====buffer allocated on heap of required size=======<Guard>
如果您溢出缓冲区,插入的保护会损坏,当您尝试删除缓冲区时,调试器将在检测到缓冲区溢出后断言。
在大型代码库中查找缓冲区溢出有点困难。我会建议几种方法来帮助您检测这种情况:
【讨论】:
最简单的重现方法是这样的:
//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;
检查您是否正在写入超出其分配空间的内存位置。
【讨论】:
使用正确的选项,Visual C++ 会在每个缓冲区的末尾抛出一个保护值。当您释放缓冲区时,它会检查这是否仍然有效。如果不是,它会引发您看到的错误。
此错误的最常见原因是缓冲区溢出。但是,它可能(理论上)是由随机指针写入引起的(毕竟,它可能写入保护值)。
不过,赔率是超支。
【讨论】: