做了一个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也是一样的错误。

解决方案 »

  1.   

    可是即使用了m.a.RemoveAll();
    也是一样的错误。
    Release就没有错误/
      

  2.   

    onemore(老会计) :
    即使是静态分配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版就有错?
      

  3.   

    用CString作为参数在Exe和DLL中进行跨模块利用实际上就是跨模块
    进行内存的释放和申请。(包括类内部用CString的--比如CStringArray)??你是不是用了静态MFC而不是动态MFC DLL??
    在Debug中出错是因为释放内存失败就会出现错误。而Release中
    对一个内存连续释放两次是不会报告错误的(续释放两次当然是错误的)
    在Release中对一个不是内存的指针进行释放也不会出错误。跨模块进行内存的释放和申请是不好的习惯,在SDK程序肯定有问题。
    静态MFC DLL的效果和SDK是一样的。
      

  4.   

    verybigbug:
    我原来是用MFC Static  DLL。
    现在Project\General\中改选为Use MFC in a Dynamic Library,
    还是一样的错。
      

  5.   

    全部要用动态MFC DLL。
    Exe和DLL都必须用动态MFC DLL重新编译。