关于库函数里申请的内存空间在库函数外释放的问题的一些总结

其实之前就碰到过这种问题,只不过当时的做法是学了很多windows库函数的做法:

假如现在需要调用int fun(char * pData);函数从库里面取得一段数据。

1.先调用fun(NULL)一次,返回值是填充所取数据所需的内存空间的大小(一般是字节数);

2.根据返回的字节数大小,申请内存空间,再次调用fun(pData);这次返回的数据就填充在了pData里了。

3.用完pData里的数据后再释放掉pData;

以上方式是在库函数外申请内存空间,然后在库函数外释放内存空间。调用有点麻烦,而且要给出说明。


以上的调用方式非常适合fun函数获取所需内存空间大小很方便的情况,或者说所化代价较小的情况。否则的话最好还是在库里申请内存,填充数据后,等数据用完再在库函数里释放掉。


比如我要从库里面取一个int数组,我可以传进去一个vector<int> vecobj; 但是我不知道能够取到的数组是多大。所以我无法事先确定vector的大小。如果调用reserve(num),假如

num大了,没有问题,但是浪费空间,如果小了的话,那么vecobj会在库里面重新分配一次内存,那么vecobj里的用来存数组的内存就是在库里面申请的了,但是vecobj对象(不包括数组内存)还是在库外申请的栈对象。所以等到vecobj的生命周期结束后,在库外析构vecobj时当释放掉库里面申请的数组内存时,可能会报错(如果库和exe的编译方式不同)。


我现在的做法是vector<int> vecobj;库外申请的空的vector对象。fun(vector<int> & vecobj);库函数fun()里push_back();自己根据vector的内存管理机制来申请内存。

添加一个释放vector接口:Release(vector<int> & vecobj);


void Release(vector<int> & vecobj)

{

      //用一个空的vector<int>来和vecobj进行交换。

       vecobj.swap(vector<int> ());

}

这样子空vector里最后会包含数组内存,空vector为临时变量vecTemp,那么vecTemp和数组内存就都是库里面申请的内存了,vecTemp的生命周期到了后,vecTemp会在库内自动释放。

而vecobj此时就仅仅只是一个壳了,他里面是没有数组内存了的,里面的数据指针,first,last,end等都为空。那么在库外vecobj生命周期到了后也就自动释放了。


总之一句,谁申请谁释放,这是最安全 的做法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值