DLL 部分:
 // 头文件
extern "C"  void __declspec(dllexport) add(int x,int y, int *result);
extern "C"  int __declspec(dllexport)* add1(int x, int y); // cpp文件
/* fill in result */
void add(int x,int y, int* result)
{
if(result) {
*result = x + y;
} return;
}
 /* new a int in dll */
int* add1(int x, int y)
{
int *result = new int;
*result = x + y; return result;
}
VC console客户端部分:typedef void ( * lpAddFun)(int,int,int*);
typedef int* ( * lpAddFun1)(int,int);
 
int main(int argc, char* argv[])
{
HINSTANCE hDll;   //DLL句柄
lpAddFun addFun;  //函数指针
lpAddFun1 addFun1;    hDll = LoadLibrary("..\\dllTest.dll");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll,"add");
addFun1 = (lpAddFun1)GetProcAddress(hDll,"add1");
if(addFun!=NULL)
{
    int* result = new int; // 自己new
    addFun(2,3,result); 
    printf("%d",*result); // 自己删,正确
    delete result; result = addFun1(2,3); // 让DLL new
delete result; // 这里出错,debug版本的free函数提示不是合法的heap
}
FreeLibrary(hDll);
}
return 0;
}就命啊,为什么VC客户端不能够释放DLL中new 的资源呢!!!!

解决方案 »

  1.   

    当然不可以。
    你可以在dll中做个函数
    ReleaseRes(),在其中做释放资源的工作在客户端调用它
      

  2.   

    为什么啊?
    大哥请给一个其他的解决方案吧,我记得以前好多基于DLL plug-in框架的programes都可以这么做的呀。因为我的客户端程序使用的是基于reference count的智能指针,所以必须在客户段程序里面delete资源。
      

  3.   

    和dll与exe的编译模式有一定关系, 按Featured说的做吧
      

  4.   

    goodboyws, 那能不能说说应该使用什么方式编译呢?
    我试过在VC console客户端里使用静态绑定lib,调用add1函数,然后delete结果,仍然是相同的错误。
    大家再多给点儿意见吧。
      

  5.   

    内存释放原则:谁new就由谁来delete
    所以你在DLL中做一个函数来释放
      

  6.   

    你看过  WINDOWS 核心编程没有 
    大牛 告诉我们 由谁申请的内存 就应该由谁提供函数 来释放你在DLL中申请的内存 就应该在DLL中提供一个函数来释放它