C++智能指针简析

导读

C++面试过程中,很多面试官都喜欢问智能指针相关的问题,比如你知道哪些智能指针?shared_ptr的设计原理是什么?如果让你自己设计一个智能指针,你如何完成?等等……。而且在看开源的C++项目时,也能随处看到智能指针的影子。这说明智能指针不仅是面试官爱问的题材,更是非常有实用价值。

本文参考自《C++ Primer Plus》。

目录

  1. 智能指针背后的设计思想
  2. C++智能指针简单介绍
  3. 为什么摒弃auto_ptr?
  4. unique_ptr为何优于auto_ptr?
  5. 如何选择智能指针?
  6. 自己尝试构建智能指针

正文

1.          智能指针背后的设计思想

如果忘记在适当的地方加上delete语句,就会导致潜在的内存泄露问题。不仅需要考虑到函数正常终止路径,还要考虑由于出现了异常而终止的情况。

代码离开作用域的时候,本地变量都将自动从栈内存中删除。同样情况下,如果指针被声明为本地变量,那么指针本身占据的内存将被释放,如果该指针指向的内存也被自动释放,那该有多好啊。
我们知道析构函数有这个功能。如果指针变成一个类对象,具有一个析构函数,该析构函数将在指针过期时自动释放它指向的内存。但问题在于,一个常规指针不是有析构凼数的类对象。如果它是和指针相关的对象,则可以在对象过期时,让它的析构函数删除指针指向的内存。

2.          C++智能指针简单介绍

STL一共给我们提供了四种智能指针:auto_ptr、 unique_ptr、 shared_ptr和weak_ptr(本文章暂不讨论)。
模板auto_ptr是C++98提供的解决方案,C+11已将将其摒弃,并提供了另外两种解决方案。然而,虽然auto_ptr被摒弃,但它已使用了好多年:同时,如果您的编译器不支持其他两种解决力案,auto_ptr将是唯一的选择。

使用注意点

·        所有的智能指针类都有一个explicit构造函数,以指针作为参数。比如auto_ptr的类模板原型为:

templet<class T>

class auto_ptr {

  explicit auto_ptr(T* p = 0) ;

  ...

};

因此不能自动将指针转换为智能指针对象,必须显式调用:

shared_ptr<double> pd;

double *p_reg = new double;

pd = p_reg;                                                 // notallowed (implicit conversion)

pd = shared_ptr<double>(p_reg);              // allowed (explicitconversion)

shared_ptr<double> pshared = p_reg;       // not allowed (implicitconversion)

shared_ptr<double> pshared(p_reg);         // allowed (explicitconversion)

·        对全部三种智能指针都应避免的一点:

string vacation("I wandered lonely as acloud.");

shared_ptr<string> pvac(&vacation);   // No

pvac过期时,程序将把delete运算符用于非堆内存,这是错误的。

 

使用举例

#include <iostream>

#include <string>

#include <memory>

 

class report

{

private:

    std::string str;

public:

  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值