使用C++11解决内存泄漏的问题

    C++语言中没有垃圾回收机制,必须自己去释放分配的堆内存,否则就会内存泄漏。相信大部分C++开发人员都遇到过内存泄漏的问题,而查找内存写了的问题往往要花大量的精力。

    解决这个问题最有效的办法就是使用智能指针(Smart Pointer)。使用智能指针就不用担心这个问题了,因为智能指针可以自动删除分配的内存。智能指针和普通指针类似,只是不需要手动释放指针,而是通过智能指针自己管理内存的释放,这样就不用担心内存泄漏的问题了。

C++提供了三种智能指针:std::shared_ptr ; std::uniq_ptr ; std::weak_ptr .

1. shared_ptr共享的智能指针

Std::shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。在最后一个shared_ptr析构的时候,内存才会被释放。

基本用法:

初始化:
可以通过构造函数、std_make_shared辅助函数和reset方法来初始化shared_ptr:
// 构造函数初始化
Std::shared_ptr p ( new int(1) ) ;
Std::shared_ptr p2 = p ;
// 对于一个未初始化的智能指针,可以通过reset方法来初始化。
Std::shared_ptr ptr; ptr.reset ( new int (1) ) ;
If (ptr) { cout << “ptr is not null.\n” ; }

不能将一个原始指针直接赋值给一个智能指针:
Std::shared_ptr p = new int(1) ;   // 编译报错,不允许直接赋值

获取原始指针:
通过get方法来返回原始指针
Std::shared_ptr ptr ( new int(1) ) ;
Int * p = ptr.get () ;

指针删除器:
智能指针初始化可以指定删除器
Void DeleteIntPtr ( int * p ) {
delete p ;
}
Std::shared_ptr p ( new int , DeleteIntPtr ) ;
当p的引用技术为0时,自动调用删除器来释放对象的内存。删除器也可以是一个lambda表达式,例如
Std::shared_ptr p ( new int , [](int * p){delete p} ) ;

注意事项:
1.不要用一个原始指针初始化多个shared_ptr。
2.不要再函数实参中创建shared_ptr,在调用函数之前先定义以及初始化它。
3.不要将this指针作为shared_ptr返回出来。
4.要避免循环引用。

2. unique_ptr 独占的智能指针

Unique_ptr是一个独占的智能指针,他不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另外一个unique_ptr。
unique_ptr不允许复制,但可以通过函数返回给其他的unique_ptr,还可以通过std::move来转移到其他的unique_ptr,这样它本身就不再拥有原来指针的所有权了。
如果希望只有一个智能指针管理资源或管理数组就用unique_ptr,如果希望多个智能指针管理同一个资源就用shared_ptr

3. weak_ptr弱引用的智能指针

    弱引用的智能指针weak_ptr是用来监视shared_ptr的,不会使引用计数加一,它不管理shared_ptr内部的指针,主要是为了监视shared_ptr的生命周期,更像是shared_ptr的一个助手。
    weak_ptr没有重载运算符*和->,因为它不共享指针,不能操作资源,主要是为了通过shared_ptr获得资源的监测权,它的构造不会增加引用计数,它的析构不会减少引用计数,纯粹只是作为一个旁观者来监视shared_ptr中关离得资源是否存在。
    weak_ptr还可以用来返回this指针和解决循环引用的问题。
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值