如何删除在函数中new出来的对像?

feesees 2009-10-07 09:48:09
CString word = GetWord(hHandle, index);
char* str = new char[word.GetLength()];
strcpy( str, word.GetBuffer(word.GetLength() );
return str;

这个是一个vc的dll中的函数体
在C#中调用它.但是如何释放这块内存泥?
还是C#在调用完了后会自动释放?
[dllimport..............

在现在的程序中会调用N次这个函数...
上边是个示例
...全文
236 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zoulie 2009-10-08
  • 打赏
  • 举报
回复
DLL既然提供了new方法那么最好提供delete方法,如果运行期库不一样就会导致程序崩溃
  • 打赏
  • 举报
回复
将指针的申请放在一个类的构造函数中
delete放在该类的析构函数中
在DLL中产生改对象
对象会自动析构,指针就自动释放了
以前学到得一招
好像是STL里面的还是BOOST的
axing0123 2009-10-08
  • 打赏
  • 举报
回复
UP....
feesees 2009-10-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 coding_hello 的回复:]
大家都跟你建议了释放的方法,你咋还要等出问题了再想办法呢。。。。

DLL是native的库,不是C#运行库分配的,它能GC回收?我不懂C#,只是觉得不太可能。
[/Quote]
呵呵.问题主要是:
在传到c#这块内存指针的时候.难道我还要在C#中调用一个函数去释放?这个函数中使用
delete []p?
那么.很显然.我得存下这个函数指针.而这样.我得用个全局变量 .有多少操作字符的函数.得多少个全局变量了.
野男孩 2009-10-08
  • 打赏
  • 举报
回复
大家都跟你建议了释放的方法,你咋还要等出问题了再想办法呢。。。。

DLL是native的库,不是C#运行库分配的,它能GC回收?我不懂C#,只是觉得不太可能。
dragon33tree 2009-10-08
  • 打赏
  • 举报
回复
可以改成调用函数之前new好内存,把指针当作参数带入函数内部。
这样DLL就可以用自己去分配内存了。
最好还要增加一个参数指示一下带入指针的最大size
在DLL函数内部做个越界检查,就OK了。
心留 2009-10-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 akirya 的回复:]
呃,dll中再写一个函数 传入返回的str 然后函数内部delete。

或者你用API分配内存,然后C#调用API释放内存
[/Quote]

同意
pady_pady 2009-10-08
  • 打赏
  • 举报
回复
使用gcnew算了,哈哈,不然你必需提供释放方法的。
feesees 2009-10-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tr0j4n 的回复:]
如果是在C#中调用就没关系,会被gc回收掉的,不要怕
[/Quote]
希望如你所言.我先这样搞着.有内在越用越大的问题我再想办法.
supconsupcon 2009-10-07
  • 打赏
  • 举报
回复
谁分配谁释放
bulijun1987 2009-10-07
  • 打赏
  • 举报
回复
谁分配谁释放
ccc_cgreen 2009-10-07
  • 打赏
  • 举报
回复
按照微软的建议,谁分配谁释放。
还有一点需要注意,分配内存和释放内存所调用的运行时库必须是同一个运行时库。像楼主这种不在同一个DLL里面分配释放,很容易造成分配内存的运行时库和释放内存的运行时库不一致,导致释放时候程序崩溃。。
一条晚起的虫 2009-10-07
  • 打赏
  • 举报
回复
//我觉得还是应该由C#负责内存的分配和清理
//可以第一次调用返回需要的空间大小,第二次...
woyaowenzi 2009-10-07
  • 打赏
  • 举报
回复
前面的几位大牛都说过了,
在dll里面应该要有两个函数,一个是分配内存的函数mallocStr(),另外一个释放内存的函数deleteStr(),
在C#里面先调用mallocStr()得到字符串,用完后再调用一次deleteStr()
MoXiaoRab 2009-10-07
  • 打赏
  • 举报
回复
如果是在C#中调用就没关系,会被gc回收掉的,不要怕
  • 打赏
  • 举报
回复
用 delete啊
野男孩 2009-10-07
  • 打赏
  • 举报
回复
同意楼上,DLL应该提供一个释放内存的函数。或者DLL自动回收,比如加到定时器里面1分钟之后自动释放。
  • 打赏
  • 举报
回复
呃,dll中再写一个函数 传入返回的str 然后函数内部delete。

或者你用API分配内存,然后C#调用API释放内存

16,551

社区成员

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

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

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