c – 仅在调试器外的释放模式下程序崩溃

c – 仅在调试器外的释放模式下程序崩溃,第1张

概述我有相当大的程序(> 10k行的C代码).在Visual Studio中启动时,它在调试模式或发布模式下工作正常,但是从命令行手动启动时,释放模式二进制文件通常会崩溃(不总是!!!). 删除的行导致崩溃: bool Save(const short* data, unsigned int width, unsigned int height, const wstring* i 我有相当大的程序(> 10k行的C代码).在Visual Studio中启动时,它在调试模式或发布模式下工作正常,但是从命令行手动启动时,释放模式二进制文件通常会崩溃(不总是!!!).

删除的行导致崩溃:

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做一些事情,它会在删除时崩溃.

编辑:应用程序工作正常没有删除[]行,但我认为它泄漏内存然后(因为块从未被分配). buf从来没有使用过删除行.它也似乎不会崩溃与任何其他类型比char.现在我真的很困惑

崩溃消息非常特别(典型的windows“xyz.exe已停止工作”).当我点击“调试程序”选项时,它进入VS,其中错误被指定为“访问冲突写入位置xxxxxxxx”.它无法通过“没有符号加载任何堆栈帧”找到错误的位置.

我想这是一个非常严重的堆损坏的情况,但是如何调试这个?我应该找什么?

感谢帮助.

解决方法 你在其他地方检查了内存泄漏吗?

通常,奇怪的删除行为是由一个堆被破坏引起的,然后在很久以后,由于另一个堆使用而变得明显.

调试和释放之间的区别可能是由windows在每个上下文中分配堆的方式引起的.例如在调试中,堆可能非常稀疏,并且损坏不会立即影响任何事情.

总结

以上是内存溢出为你收集整理的c – 仅在调试器外的释放模式下程序崩溃全部内容,希望文章能够帮你解决c – 仅在调试器外的释放模式下程序崩溃所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1252482.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存