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 的资源呢!!!!
// 头文件
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 的资源呢!!!!
解决方案 »
- CListCtrl 显示
- 帮忙啊帮忙啊
- 一句话问题, 一个线程读,一个线程写需要做互斥码??
- 关于CDatabase类中的Begintrans()和rollback()函数的使用方法!急
- 在CHtmlView的下载网页中有一个按钮,如保改变按钮调用的脚本内容,使它调用自已的脚本
- 请问用_beginthreadex创建的线程是否可以在线程函数里调用MFC API 或WIN32 API函数
- 如何伪造报文?
- 怎么檫用背景图檫去位图。。。。
- ******声音平滑处理****(提供思路 & UP 有分,提供代码者送 200分)
- 数组排序的小疑问
- include wincrypt.h问题
- 如果可以,请把<windows网络编程技术>书的配套源代码发给我。
你可以在dll中做个函数
ReleaseRes(),在其中做释放资源的工作在客户端调用它
大哥请给一个其他的解决方案吧,我记得以前好多基于DLL plug-in框架的programes都可以这么做的呀。因为我的客户端程序使用的是基于reference count的智能指针,所以必须在客户段程序里面delete资源。
我试过在VC console客户端里使用静态绑定lib,调用add1函数,然后delete结果,仍然是相同的错误。
大家再多给点儿意见吧。
所以你在DLL中做一个函数来释放
大牛 告诉我们 由谁申请的内存 就应该由谁提供函数 来释放你在DLL中申请的内存 就应该在DLL中提供一个函数来释放它