天天看点

c++11中避免内存泄露的机制

1.智能指针解决内存泄漏的问题

1.1.智能指针是存储只想动态内存分配对象的指针类,用于生存期的控制,能够确保在离开指针所作用域时,自动正确的销毁动态分配的对象,防止内存泄漏

通过使用引用计数实现,使用一次增1,析构一次减1

1.2.三种智能指针

a.shared_ptr共享的智能指针

使用引用计数,每一个shared_ptr拷贝都指向一个相同的内存,最后一次析构释放

初始化

不能直接将原始指针赋值来初始化,只能通过构造函数和辅助方法来初始化

智能指针可以通过bool类型来判断指针是否为null

一个未初始化的智能指针可以通过reset方法初始化;当智能指针中有值的时候,用reset会使引用计数减1

获取原始指针

int* p = ptr.get()

指定删除器

当p引用计数为0时,自动调用删除器deleteIntPtr释放内存

当管理动态数组的时候,默认删除其不支持数组对象,需要指定

指定删除器delete[]

用default_delete作为删除器

通过封装make_shared_arry方法让shared_ptr支持数组

注意事项

不要用一个原始指针初始化多个shared_ptr

不要在函数的实参中创建shared_ptr

不要将this指针作为shared_ptr返回出来,要用shared_from_this()

原因enable_shared_from_this类中有一个weak_ptr,用来观测this智能指针,调用shared_from_this()时,会调用内部这个weak_ptr的lock方法

避免循环引用

b.unique_ptr独占的智能指针

是一个独占型的智能指针

不允许其他的智能指针共享内部的指针,也不允许通过赋值给另外一个,不允许复制

可以通过函数返回、move转移到其他unique_ptr中

unique_prt可以指向一个数组

指定删除器的时候需要确定删除器的类型

c.weak_ptr弱引用智能指针

是用来监视shared_ptr生命周期,不会使引用计数加1,不共享指针,不操作资源

基本用法

use_count()获得当前观测资源的引用计数

expired()方法判断所观测的资源是否已经被释放

lock方法获取所监视的shared_ptr

weak_ptr返回this指针

解决循环引用问题

其中一个成员变量改成weak_ptr就可以

1.3.通过智能指针管理第三方库分配的内存

ScopeGuard与GURAD的区别

ScopeGurad是确保能够正确的进行异常处理,没有异常,正常出函数作用域

GURAD是为了能在各种场景下正确释放内存,本质上是一个智能指针

继续阅读