线程安全的对象生命期管理(三)

C++里可能出现的内存问题大致有这么几个方面:

        1、缓冲区溢出

        2、空悬指针/野指针

        3、重复释放

        4、内存泄漏

        5、不配对的new[]/delete

        6、内存碎片

    正确使用智能指针能很容易地解决前面5个问题。

          1、缓冲区溢出:用vector<char>/string或自己编写Buffer class来管理缓冲区,自动记住已使用缓冲区的长度,并通过成员函数而不是裸指针来修改缓冲区

          2、空悬指针/野指针:智能指针就是来解决指针问题的

          3、重复释放:scoped_ptr,引用计数为0时才释放对象

          4、内存泄漏:同样用scoped_ptr,对象析构时自动释放,无需delete

          5、不配对的new[]/delete:把new[]统统替换为vector/scoped_array(用类或者智能指针之类的方式自动管理内存)。

          现在的C++程序中最好不要出现delete语句,资源(包括复杂对象本身)最好都通过专门的对象(智能指针或容器)来管理,程序员不需要管理内存,就可以最大可能避免内存问题。

         对于智能指针的使用场景,一般只有以下几种:栈上对象、其他对象的直接数据成员或是标准库容器里的元素,而不应该出现动态开辟的情形。

          

shared_ptr<Foo>* pFoo = new shared_ptr<Foo>(new Foo);

          还要注意,如果智能指针时对象的数据成员,而它的模板参数是incomplete类型,那么对象的析构函数不能是默认或内联的,必须在.cpp文件里显示定义,否则会有编译错误或者运行错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值