Code Bye

方法返回之前如何释放要返回对象的内存?

 

我写的一个方法,值是一串长字符串,保存在一个指针里,请问如何在返回改值之前释放掉改值的内存?

char * pBuf;
return pBuf;

pbuf这个指针大小在1Kb之上。

10分
又要返回串, 又要释放内存….. 你这个要求不对.
因为你返回的是指针, 那么就肯定需要在函数返回后, 这个指针仍然有效.  但你说要删除掉, 那这个指针都无效了, 你返回了也是错的.
应该让函数调用者去释放.
或者使用更高级的智能指针, 有内存引用计数, 
引用 1 楼 xiaohuh421 的回复:

又要返回串, 又要释放内存….. 你这个要求不对.
因为你返回的是指针, 那么就肯定需要在函数返回后, 这个指针仍然有效.  但你说要删除掉, 那这个指针都无效了, 你返回了也是错的.
应该让函数调用者去释放.
或者使用更高级的智能指针, 有内存引用计数, 

其实我是做了个dll供其它程序使用,那么我调用这个dll的时候是不是会自动释放内存?我只要返回这个指针对应的字符串就行了,使用者应该怎么释放内存?

10分
你把这个指针指向的内存释放了,调用方如何可靠地从这个指针指向的内存中获取数据?
一般来说,这类问题在C中有两种解决方法
1.调用方事先分配内存,将分配的内存地址和长度作为参数传递给被调用方,就像gets那样
2.被调用方malloc分配内存,调用方负责释放,就像glibc的getline那样
如果是C++的话,可以考虑使用std::string代替char*形式的字符串
10分
没太懂你要求,推荐使用标准模板库中的智能指针,可以在你不需要的时候自动释放的,不用自己去写代码释放
10分
Dll和调用者之间最好是谁分配谁释放原则,在构造函数中分配,在析构函数中释放,这是常识
引用 2 楼 ljaahh 的回复:

其实我是做了个dll供其它程序使用,那么我调用这个dll的时候是不是会自动释放内存?我只要返回这个指针对应的字符串就行了,使用者应该怎么释放内存?

一般而主需要遵循:  谁申请, 谁释放原则.
比如有GetString返回一个串, 那么你就需要提供一个FreeString函数来释放这个串.   就像malloc必需跟free配对是一样一样的.

当然, 你也可以偷懒,  让用于自己去delete或者free指针.  但因为是dll中的, 跨模块释放内存, 安全性和稳定性就要差上许多了.

主要是弄清楚你所分配的这个内存中的数据是在何时不再需要了。若在dll中被释放了,外部调用者仍然需要用到内存中的数据会出现异常。
static char pBuf[4096];
return (char *)pBuf;
引用 楼主 ljaahh 的回复:

我写的一个方法,值是一串长字符串,保存在一个指针里,请问如何在返回改值之前释放掉改值的内存?

char * pBuf;
return pBuf;

pbuf这个指针大小在1Kb之上。

通常的做法是再提供一个接口用于销毁资源
MFC里面大量这样的接口

引用 9 楼 yangyunzhao 的回复:
Quote: 引用 楼主 ljaahh 的回复:

我写的一个方法,值是一串长字符串,保存在一个指针里,请问如何在返回改值之前释放掉改值的内存?

char * pBuf;
return pBuf;

pbuf这个指针大小在1Kb之上。

通常的做法是再提供一个接口用于销毁资源
MFC里面大量这样的接口

正解


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明方法返回之前如何释放要返回对象的内存?