构造函数初始化列表中的共享指针

时间:2017-01-18 07:08:39

标签: c++11 shared-ptr

我创建了一个像下面这样的共享指针

typedef std::shared_ptr<int> int_ptr;
int main()
{
   int_ptr my_int_ptr();
   std::cout << *my_int_ptr << std::endl;
}

此代码的输出为1.我不确定如何打印1。这是打印的垃圾吗?

Okie从现在开始打印了一些值,这意味着存在适当的内存。

现在应用同样的概念,但这次我的共享指针是类的成员,我在构造函数成员初始化列表中初始化它。代码如下。

typedef std::shared_ptr<int> int_ptr;
class MyInt
{

public:
    MyInt():m_myint_ptr(){
    }   

    void show() { 
    std::cout << *m_myint_ptr << std::endl; 
    }

private:
    int_ptr m_myint_ptr;
};

int main()
{
    MyInt my_int;
    my_int.show();
}

但这次我调用show函数时会出现分段错误,并且共享指针被解除引用。

我无法理解最新情况。

有人可以帮我解决以下问题吗?

  1. 如何打印1?
  2. 为什么会发生分段错误?

2 个答案:

答案 0 :(得分:2)

访问未分配的shared_ptr<>的分段错误完全正常,因为您基本上是取消引用null

有趣的是为什么你的第一次测试没有崩溃。

int_ptr my_int_ptr();

这行代码不符合您的想法。您正在声明一个名为my_int_ptr的函数,该函数返回int_ptr,而不是声明默认初始化的int_ptr实例。

答案 1 :(得分:1)

shared_ptr的默认构造函数导致空指针。这就是解除引用它的结果未定义的原因。如果您想获得一个指向新创建的int的指针,默认值为0,那么您应该尝试使用int_ptr my_int_ptr = std::make_shared<int>()