【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr

【概念直接搬运Docs】C 样式编程的一个主要 bug 类型是内存泄漏。 泄漏通常是由于为分配的内存的调用失败引起的deletenew。 现代 C++ 强调“资源获取即初始化”(RAII) 原则。 其理念很简单。 资源(堆内存、文件句柄、套接字等)应由对象“拥有”。 该对象在其构造函数中创建或接收新分配的资源,并在其析构函数中将此资源删除。 RAII 原则可确保当所属对象超出范围时,所有资源都能正确返回到操作系统。

创新互联公司专注于企业网络营销推广、网站重做改版、茂南网站定制设计、自适应品牌网站建设、HTML5建站电子商务商城网站建设、集团公司官网建设、成都外贸网站建设公司、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为茂南等各大城市提供网站开发制作服务。

为了支持对 RAII 原则的简单采用,C++ 标准库提供了三种智能指针类型:std::unique_ptr、std::shared_ptr和std::weak_ptr。 智能指针可处理对其拥有的内存的分配和删除。 下面的示例演示了一个类,其中包含一个数组成员,该成员是在调用make_unique()时在堆上分配的。 对和的new调用deleteunique_ptr类封装。 当widget对象超出范围时,将调用 unique_ptr 析构函数,此函数将释放为数组分配的内存。

在现代 c + + 编程中,标准库包含智能指针,这些指针用于帮助确保程序不会出现内存和资源泄漏,并具有异常安全。

====================================

unique_ptr

unique_ptr 类型智能指针在设计上最显著的特点是内部托管的指针一旦被创建就不能被任何形式的复制给另一个unique_ptr,只可以被移动给另一个unique_ptr。unique_ptr 没有拷贝构造函数,因此不能用于赋值。该指针最常用的情况是单例模式和编译防火墙的封装。当一个 std::unique 生命周期结束时,将释放所托管的内存,也就意味着,如果它作为一个局部变量托管一个对象,对象的生命周期也仅限于当前作用域范围,调用 reset() 或 operator= 时也会释放原有内存。

// 演示创建 unique_ptr
unique_ptr u_brain = make_unique();
u_brain->HelloWorld();

// 移动 unique_ptr
unique_ptr um_barin = std::move(u_brain);
um_barin->HelloWorld();

// 移动方法2
std::swap(u_brain, um_brain);

// 错误 // um_barin = u_brain; // u_brain->HelloWorld(); // C

// 可以使用以下方法判断是否为空指针 if (um_brain == nullptr) { std::cout << "um_brain is nullptr" << std::endl; }

// 可以释放资源将指针恢复空指针
um_brain.reset();

文章题目:【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr
文章出自:http://ybzwz.com/article/dsogosi.html