dll之间的内存使用问题

IT_worker 2002-07-14 07:35:12
用vc6.0建立一个dll(不是MFC的)它输出一个函数
__declspec( dllexport ) int* f()
{
return new int;
}
在另一个控制台程序中使用这个dll如下
__declspec( dllimport ) int* f();
int main(int argc, char* argv[])
{
int *p = f();
delete p;
return 0;
}
那么在delete p;一行会死机。
请问:
1:这是问什么?
2:有什么好的解决办法。
我知道MFC程序用MFC的dll不会有问题,因为MFC重载了new,delete算子。用malloc和free也不会有问题。我这里只是想请教一下各位高人在处理这个问题时使用什么技巧,使得符合我写new,delete而不是malloc,free的程序书写习惯。
...全文
192 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
AaronLiu 2002-07-15
  • 打赏
  • 举报
回复
补充:dingkl说的不对,在一个dll和你的进程在一个地址空间内。
AaronLiu 2002-07-15
  • 打赏
  • 举报
回复
其实你根本不用delete 函数指针,你调用DLL中的函数和调用普通的函数没有区别,都是在栈中分配内存,你把它当成普通堆上分配的内存处理当然会出问题,至于为什么要用函数指针,是应为要找到函数的入口地址的缘故。

记住一点,调用DLL中的函数和调用普通函数一样,不同的是取得函数的方式不同。
shybt 2002-07-15
  • 打赏
  • 举报
回复
你的用法我没有用过,推荐不要这么用,原因我不知道!可能是DLL内存管理的机制不同!
cwanter 2002-07-15
  • 打赏
  • 举报
回复
学C,学C,^O^
dingkl 2002-07-15
  • 打赏
  • 举报
回复
由于在DLL中分配的内存地址与你的程序地址空间不一致,因此在DLL中分配的内存要在DLL中释放
liukai10 2002-07-15
  • 打赏
  • 举报
回复
在《windows程序设计》一书465页有类似的说明,大致是改为这样:
__declspec( dllexport ) int* f()
{
int *p = new int;
return p;
}

__declspec( dllexport ) void* freef(int *p )
{
delete p;
}

__declspec( dllimport ) int* f();
__declspec( dllexport ) bool* freef(int *p );

int main(int argc, char* argv[])
{
int *p = f();
freef(p);
return 0;
}

原因:书上写了。
IT_worker 2002-07-15
  • 打赏
  • 举报
回复
to : liukai10(笑皇朝)
如果要增加一个函数的话,我不如用malloc和free
to : dingkl()
一个进程,地址空间是一样的,跟dll无关
to : AaronLiu(放不稳的鸡蛋)
看来你是搞错题目了!请注意:是int *p = f();而不是 void *p=f;
p=f()是得到f返回的一个指针,而p=f;是得到函数地址。

to : webber84(糕鱼昏)
真的非常感谢你!以后在不用MFC的跨dll程序中也可以随意的用new和delete而不是malloc和free了,真爽!
zhou_hn 2002-07-15
  • 打赏
  • 举报
回复
return new int

int *p = f();
delete p;
你觉得一致吗?
jack4liang 2002-07-15
  • 打赏
  • 举报
回复
liukai10(笑皇朝)
给你稍微改一下
//test.cpp
#pragma comment( lib, "nothingatall/debug/nothingatall" )

__declspec( dllimport ) int* f();
__declspec( dllimport ) void freef(int *p );

int main(int argc, char* argv[])
{
int *p = f();
freef(p);
return 0;
}

//nothingatall.cpp
__declspec( dllexport ) int* f()
{
int *p = new int;

return p;
}

__declspec( dllexport ) void freef(int *p )
{
delete p;
}

FCC 2002-07-15
  • 打赏
  • 举报
回复
学习``
webber84 2002-07-15
  • 打赏
  • 举报
回复
如果你使用C Runtime Library的静态链接版本的话,不能在一个模块(Module)中用new操作符分配内存然后在另一个模块中用delete释放.
解决办法:使用C Runtime Library的动态链接版本(在你的console工程中设置忽略所有的默认链接库,然后链接到msvcrt.lib就可以了).

69,999

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧