dll返回的char *的字符串 需要释放这个指针么

mixdd 2010-03-09 07:13:17
dll



extern "C" __declspec(dllexport) char* ShowTime(void);// 这个用于
extern "C" __declspec(dllexport) char* ShowTime(void)
{
char *p=new char[20];
strcpy_s(p,10,"morning");
return p;
}




主程序

HINSTANCE hDll; //DLL句柄

lpgetname addname; //函数指针变量

hDll = LoadLibrary(_T("mydll.dll"));
char *myname;

if (hDll != NULL)

{

addname = (lpgetname)GetProcAddress(hDll, "ShowTime");

if (addname != NULL)

{

myname = addname();

TRACE(_T("%s\n"), myname);


}

FreeLibrary(hDll);
// delete myname;//这里一释放指针就出错
}




请教了谢谢
...全文
313 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
o_yale_o 2010-03-09
  • 打赏
  • 举报
回复
一般是:谁申请谁释放
WizardK 2010-03-09
  • 打赏
  • 举报
回复
引用 2 楼 mixdd 的回复:
谢谢楼上的
还有个问题

我看到好像还有个做法 是在外面exe中申请char* p的空间
然后把指针传入到dll中
最后再外面释放p

这样是否也行 那种更好呢?


This is a better way for preventing memory leak by coding mistake.
muzizongheng 2010-03-09
  • 打赏
  • 举报
回复
引用 2 楼 mixdd 的回复:
谢谢楼上的
还有个问题

我看到好像还有个做法 是在外面exe中申请char* p的空间
然后把指针传入到dll中
最后再外面释放p

这样是否也行 那种更好呢?


可以, 只要遵循原则: 谁申请, 就谁释放。
lmxmx 2010-03-09
  • 打赏
  • 举报
回复
两种都可以

最好是在EXE中分配、销毁,向DLL传入char* p ,

否则在多个EXE同时使用DLL时,如果释放不及时,DLL的堆消耗的非常快……

mixdd 2010-03-09
  • 打赏
  • 举报
回复
谢谢楼上的
还有个问题

我看到好像还有个做法 是在外面exe中申请char* p的空间
然后把指针传入到dll中
最后再外面释放p

这样是否也行 那种更好呢?
野男孩 2010-03-09
  • 打赏
  • 举报
回复
dll中提供一个函数void FreeMem(void* ptr)用来释放DLL自己分配的内存。

exe在myname = addname();之后,调用FreeMem(myname)来释放内存。


注意:不要在exe里面直接delete。因为exe和dll用的可能不是同一个heap.

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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