做了一个DLL(Debug 版)
//Test.h
class MyClass{
public:
CStringArray a;
int n;
};int __declspec(dllexport) Test(MyClass* m);//Test.cpp
int Test(MyClass* m)
{
m->n=100;
CString *s=new CString;
s->Format("Test String");
m->a.Add(*s);
return 1;
}做一个程序(Debug版)调用这个DLL
#include "Test.h"
//也包含了Test.dll,Test.lib
MyClass m;Test(&m);for(int i=0; i<m.a.GetSize(); i++)
printf("%s\n",m.a.GetAt(i));输出结果
Test String
结果正常,但是出现一个异常对话框:Debug Assertion Failed.
File:dgbheap.c跟踪进去看是错在CStringArray析构函数中。
Release版就没有错。为什么Debug版就有错?
用过STL的vector也是一样的错误。
//Test.h
class MyClass{
public:
CStringArray a;
int n;
};int __declspec(dllexport) Test(MyClass* m);//Test.cpp
int Test(MyClass* m)
{
m->n=100;
CString *s=new CString;
s->Format("Test String");
m->a.Add(*s);
return 1;
}做一个程序(Debug版)调用这个DLL
#include "Test.h"
//也包含了Test.dll,Test.lib
MyClass m;Test(&m);for(int i=0; i<m.a.GetSize(); i++)
printf("%s\n",m.a.GetAt(i));输出结果
Test String
结果正常,但是出现一个异常对话框:Debug Assertion Failed.
File:dgbheap.c跟踪进去看是错在CStringArray析构函数中。
Release版就没有错。为什么Debug版就有错?
用过STL的vector也是一样的错误。
也是一样的错误。
Release就没有错误/
即使是静态分配CString,也是一样的错误;做了一个DLL(Debug 版)
//Test.h
class MyClass{
public:
CStringArray a;
int n;
};int __declspec(dllexport) Test(MyClass* m);//Test.cppCString g_s;//静态分配字符串int Test(MyClass* m)
{
m->n=100;
s.Format("Test String");
m->a.Add(g_s);
return m->a.GetSize();
}做一个程序(Debug版)调用这个DLL
#include "Test.h"
//也包含了Test.dll,Test.lib
MyClass m;Test(&m);for(int i=0; i<m.a.GetSize(); i++)
printf("%s\n",m.a.GetAt(i));输出结果
Test String
结果正常,但是出现一个异常对话框:Debug Assertion Failed.
File:dgbheap.c跟踪进去看是错在CStringArray析构函数中。Release版就没有错。为什么Debug版就有错?
进行内存的释放和申请。(包括类内部用CString的--比如CStringArray)??你是不是用了静态MFC而不是动态MFC DLL??
在Debug中出错是因为释放内存失败就会出现错误。而Release中
对一个内存连续释放两次是不会报告错误的(续释放两次当然是错误的)
在Release中对一个不是内存的指针进行释放也不会出错误。跨模块进行内存的释放和申请是不好的习惯,在SDK程序肯定有问题。
静态MFC DLL的效果和SDK是一样的。
我原来是用MFC Static DLL。
现在Project\General\中改选为Use MFC in a Dynamic Library,
还是一样的错。
Exe和DLL都必须用动态MFC DLL重新编译。