假如一个函数在申请了堆内存,并且这个函数可能在多处返回,怎么样处理堆内存的释放?
本人遇到的问题如下(伪代码):
int funA()
{
unsigned char *pHeap = funB();//funB函数内部申请的堆内存,返回给pHeap,并且申请的内存是一个unsinged char的数组
if(….) return x;
if(….) return y;
//……..多种情况都导致funA()返回
}
假如在每次返回的代码前加释放的语句,感觉有些难看。
假如用智能指针 感觉好像有问题,而且这个智能不是维护的一个类对象,本人用代码测试了shared_ptr<unsigned char> pSharedHeap,跟踪一下智能指针 的释放,它最后只是用delete 来释放内存,而不是delete[]。这样的话,也是会内存泄漏吧。
本人该怎么处理这个问题?
希望论坛的朋友帮帮忙,给些建议。谢谢。
本人遇到的问题如下(伪代码):
int funA()
{
unsigned char *pHeap = funB();//funB函数内部申请的堆内存,返回给pHeap,并且申请的内存是一个unsinged char的数组
if(….) return x;
if(….) return y;
//……..多种情况都导致funA()返回
}
假如在每次返回的代码前加释放的语句,感觉有些难看。
假如用智能指针 感觉好像有问题,而且这个智能不是维护的一个类对象,本人用代码测试了shared_ptr<unsigned char> pSharedHeap,跟踪一下智能指针 的释放,它最后只是用delete 来释放内存,而不是delete[]。这样的话,也是会内存泄漏吧。
本人该怎么处理这个问题?
希望论坛的朋友帮帮忙,给些建议。谢谢。
解决方案
40
auto uchar_arr_deleter = [](unsigned char *p){delete [] p;};
std::shared_ptr<unsigned char, decltype(uchar_arr_deleter)> pShareHeap(new unsinged char[100], uchar_arr_deleter);
/////// 随便写的,具体去查 std::shared_ptr 的文档。
—
你这个需求不需要 shared_ptr, std::unique_ptr<unsigned char[]> pUniqueHeap; 就可以了。
std::shared_ptr<unsigned char, decltype(uchar_arr_deleter)> pShareHeap(new unsinged char[100], uchar_arr_deleter);
/////// 随便写的,具体去查 std::shared_ptr 的文档。
—
你这个需求不需要 shared_ptr, std::unique_ptr<unsigned char[]> pUniqueHeap; 就可以了。