【发布时间】:2011-09-27 04:49:00
【问题描述】:
Ours 是一个 MFC 应用程序,它链接到一个 win32 DLL。当应用程序调用这个 DLL 函数时,参数“buffer”在进入函数堆栈后变成了一个“Bad Pointer”。这会导致应用程序崩溃。
static MyClass* Instance(string& buffer);
我将参数类型更改为“char *”,但它只会将崩溃推送到函数中的下一条语句。如何检测这种堆损坏?
一些提示
- 即使我从应用程序的一开始就调用此 DLL 函数(CWinApp 构造函数),此崩溃也是可重现的。这种内存损坏是否是由加载资源、清单等引起的?
- 在 Vista 和 Win7 中会发生崩溃,但在 XP 中不会发生。
- 这两个项目最近都从 Visual Studio 2002 迁移到 VS2008。
调用函数的代码
CString data = "some string";
string str = data.GetBuffer();
data.ReleaseBuffer();
MyClass *obj = MyClass::Instance(str);
【问题讨论】:
-
目标操作系统位版本是多少? 32 位还是 64 位?
-
它是一个 32 位应用程序
-
显示调用实例的邮政编码。 exe和dll是否都使用相同类型的共享crt(多线程dll/单线程dll)?
-
发布调用代码。 exe和dll都使用多线程dll的共享CRT
-
在Instance的调用过程中,字符串分配的内存是否真的发生了变化?查看内存窗口中的字符串内容 - 不要依赖快速观察窗口来获取 str。请注意,您应该能够将数据分配给 str,例如“str = (LPCTSTR) data;”然后可以删除 ReleaseBuffer 调用。
标签: visual-studio visual-studio-2008 memory-leaks mfc windows-vista