【发布时间】:2011-01-21 19:09:34
【问题描述】:
我有相当庞大的程序(>10k 行 C++ 代码)。从 Visual Studio 中启动时,它在调试模式或发布模式下完美运行,但发布模式二进制文件通常在从命令行手动启动时崩溃(并非总是!!!)。
带有delete的行导致崩溃:
bool Save(const short* data, unsigned int width, unsigned int height,
const wstring* implicit_path, const wstring* name = NULL,
bool enable_overlay = false)
{
char* buf = new char[17];
delete [] buf;
}
编辑:根据要求扩展示例。
在我的测试用例中,“len”的长度为 16。没关系,如果我对 buf 做了什么,它会在删除时崩溃。
编辑:应用程序在没有 delete [] 行的情况下工作正常,但我想它会泄漏内存(因为该块永远不会未分配)。在删除行之后从未使用过的 buf。它似乎也不会因 char 以外的任何其他类型而崩溃。现在我真的很困惑。
崩溃消息非常不明确(典型的 Windows“xyz.exe 已停止工作”)。当我点击“调试程序”选项时,它进入VS,其中错误指定为“访问冲突写入位置xxxxxxxx”。虽然“没有为任何堆栈帧加载任何符号”,但它无法找到错误的位置。
我想这是一些非常严重的堆损坏情况,但是如何调试呢?我应该寻找什么?
感谢您的帮助。
【问题讨论】:
-
检查您是否使用了正确的运行时库,使用依赖库的发布版本等。很难说出确切的原因。检查指针
but是否未在其他上下文中释放(导致双重释放),或者您是否在到达delete []调用之前在某处调用了 UB(索引超出范围)。 -
即使我没有触摸 buf 指针,它也会崩溃。我只是分配空间并立即删除它并崩溃。 buf 删除后不被触碰。
-
注释掉这两行代码会不会崩溃?
-
没有。如果我注释掉第二行,它也不会崩溃。
-
你在程序中使用线程吗?
标签: c++ memory crash heap-memory