C++ Primer:判断shared_ptr是否为空智能指针?


一、背景

  最近学习到动态内存与智能指针,发现使用智能指针与普通指针类似:对指针解引用或访问指针指向对象的成员前,需先确定指针不是空指针。

二、判断方法

源程序:

// 编译环境:MinGW
#include 
#include 
using namespace std;

int main()
{
    shared_ptr p1;
    if (p1) //若不是空指针,则对指针解引用
        cout << "p1 is not nullptr : " << *p1 << endl;
    else //若是空指针,则输出提示
        cout << "p1 is nullptr" << endl;

    return 0;
}

运行结果:
运行结果
分析与总结:

  1. 若单纯定义shared_ptr p1,则p1是空指针,不可解引用或访问对象成员。
  2. 将指针p作为条件判断,若p是空指针,则返回false;若p指向一个对象,则返回ture。

三、shared_ptr与make_shared

源程序:

// 编译环境:MinGW
#include 
#include 
using namespace std;

int main()
{
    shared_ptr p1; //空指针
    if (p1)
        cout << "p1 is not nullptr : " << *p1 << endl;
    else
        cout << "p1 is nullptr" << endl;

    shared_ptr p2 = make_shared(); //p2指向一个值初始化的int
    if (p2)
        cout << "p2 is not nullptr : " << *p2 << endl;
    else
        cout << "p2 is nullptr" << endl;

    shared_ptr p3 = make_shared(1); //p3指向一个值为1的int
    if (p3)
        cout << "p3 is not nullptr : " << *p3 << endl;
    else
        cout << "p3 is nullptr" << endl;

    return 0;
}

运行结果:
运行结果
分析与总结:

  1. 若使用 shared_ptr p2 = make_shared(),则p2指向一个对象,该对象默认初始化。
  2. 若使用 shared_ptr p3 = make_shared(1),则p3指向一个对象,该对象的值为1。
  3. make_shared用于分配一个对象的内存并初始化对象,返回指向该对象的shared_ptr。
  4. 建议定义shared_ptr时直接使用make_shared初始化,避免空指针。

你可能感兴趣的:(#,C++,Primer,c++)