码迷,mamicode.com
首页 > 其他好文 > 详细

如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉

时间:2018-12-24 03:02:48      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:这一   boost   虚析构函数   自动调用   适配   智能指针   模板   引用计数   函数对象   

如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉

在STL中容器是智能的,可以在容器销毁时自动调用容器里对象的析构函数来销毁容器存储的对象。

STL的容器虽然比较智能,但是没有智能到可以自动销毁new出来的指针对象。

所以在使用STL中的容器时,如果保存的是mew出来的对象的指针。如果在容器销毁之前没有把new出来的对象释放,会造成内存泄露。

解决方法版本一:
技术分享图片
这种手工释放容器里new的对象不太可靠,菲异常安全的。如果在delete的时候爆出异常,那么还是会引起内存泄露。

解决方法二:
技术分享图片
技术分享图片
使用函数对象的方式,可以保证对象的安全销毁完,虽然在调用时需要指明函数对象类型,实现了适配器作用

但是这种方法需要公有继承,有个特殊情况,就是STL的string。
技术分享图片
string是没有虚析构函数的,所以在作为基类时,在这个对象使用完析构时,会找不到对应的析构函数,这时的行为是未知的。

解决方法三:
技术分享图片
技术分享图片
把模板化放在类里面,重载()操作符前,由编译器自动判断调用者的类型,这样就可以避免公有继承这一步操作,也就实现了通用。但是却丢弃了可适配的能力。

最优的解决方法:
技术分享图片
使用boost里的shared_ptr智能指针,通过其的自动计算引用计数的实现来,在使用STL容器保存new出来的对象指针时,超出作用域范围自动销毁智能指针里的对象,实现安全可靠高效的解决内存泄露方案。

总的来说,在使用STL容器存储new出来的对象的指针时,需要注意对象的析构销毁步骤。这一步是需要我们自己来管理的。

如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉

标签:这一   boost   虚析构函数   自动调用   适配   智能指针   模板   引用计数   函数对象   

原文地址:https://www.cnblogs.com/liangjf/p/10166039.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!