给定 %d 时,VC++ 6.0 应用程序在 CString::Format 内崩溃

Posted

技术标签:

【中文标题】给定 %d 时,VC++ 6.0 应用程序在 CString::Format 内崩溃【英文标题】:VC++ 6.0 application crashing inside CString::Format when %d is given 【发布时间】:2009-07-09 17:22:08 【问题描述】:

VC++ 6.0 应用程序在使用 %d 格式说明符执行 CString::Format 操作时崩溃。这并不总是发生,而是在应用程序内存增长到 100MB 或更多时发生。 当完成 CString 复制时,有时也会观察到相同的崩溃。 调用堆栈看起来像这样

mfc42u!CFixedAlloc::Alloc+82

mfc42u!CString::AllocBuffer+3f 00000038 00000038 005b5b64

mfc42u!CString::AllocBeforeWrite+31 00000038 0a5bfdbc 005b5b64

mfc42u!CString::AssignCopy+13 00000038 057cb83f 0a5bfe90

mfc42u!CString::operator=+4b

这会引发访问冲突异常。

【问题讨论】:

代码非常简单。要么是 LPCTSTR lpctstrMsg; CString str = lpctstrsMsg;或者对于格式一,它将是 str.Format(_T("%d"), n);其中 n 是一个整数。任何帮助将不胜感激 【参考方案1】:

如果您在分配内存时崩溃,则可能是由于堆损坏。在启用 Heaps 测试的情况下,在 AppVerifier 下运行您的应用程序。这使您可以查看代码中的各种问题,例如双重释放、堆 ovveruns/underruns 等。

【讨论】:

我明白这一点,但我担心它会在同一位置反复崩溃,但只有在应用程序运行到 100MB 或更多内存之后才会崩溃。但为什么堆损坏也会影响 string.format 格式可能需要分配内存以增加内部缓冲区。 是的,即使我想到了,但有没有可能发生这种情况。【参考方案2】:

这可能不是,但我最近遇到了a known issue,它使用 realloc 破坏了 VS6 下的小块堆。如果您在代码的其他地方使用了 realloc(或使用了类似使用 realloc 的向量),它可能会导致您所看到的。

解决此问题的方法是破解 realloc.c,编写您自己的 realloc 函数,或在您的代码中执行“_set_sbh_threshold(0)”以禁用过时的小块堆。

【讨论】:

您还应该确认您已安装 Service Pack 6

以上是关于给定 %d 时,VC++ 6.0 应用程序在 CString::Format 内崩溃的主要内容,如果未能解决你的问题,请参考以下文章

vc++6.0与opencv怎么建立工程? 希望有详细的步骤,谢谢了!!!!!!

用VC++ 6.0编写的程序怎么把它放到一个文件夹里,然后想用的时候用呢?

VC++6.0新认识

在VC++6.0中,总是出现一个叫error spawning c1.exe的错误,怎么回事呢?

vc++6.0和VC2017区别

我用的是VC++6.0通过 新建-工程-Win23 Console Application。 新建-文件-C++ Sourse File输入了程序: