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

shared pointer in constructor initializer list

我创建了一个共享指针,如下所示

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

此代码的输出是 1。我不确定 1 is getting 是如何打印出来的。它正在打印一些垃圾吗?

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

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

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. 为什么会发生段错误?

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

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

有趣的是为什么您的第一个测试没有崩溃。

int_ptr my_int_ptr();

这行代码并不像您想象的那样。您正在向前声明一个名为 my_int_ptr 的函数,它是 returns 一个 int_ptr,而不是声明 int_ptr.

的 default-initialized 实例