C++11 构造函数初始值设定项列表中的共享指针

C++11 构造函数初始值设定项列表中的共享指针,c++11,shared-ptr,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; } typedef std::shared_ptr int_ptr; int main() { int_ptr my_int_ptr(); std::cout共享的\u ptr的默认构造函数会导

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

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

std::cout共享的\u ptr的默认构造函数会导致空指针。这就是取消引用它的结果未定义的原因。如果您希望获得指向新创建的int的默认值为0的指针,您应该尝试
int\u ptr my\u int\u ptr=std::make\u shared()
相反。

共享\u ptr的默认构造函数会导致空指针。这就是为什么取消引用它的结果是未定义的。如果您希望获得指向新创建的int的指针,其默认值为0,您应该尝试
int\u ptr my\u int\u ptr=std::make\u shared()
取而代之。

访问未分配的
共享\u ptr
的分段错误是完全正常的,因为您实际上是在取消引用
null

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

int_ptr my_int_ptr();

这行代码的作用与您想象的不同。您正在向前声明一个名为
my_int_ptr
的函数,该函数返回
int_ptr
,而不是声明
int_ptr

的默认初始化实例。访问未分配
共享的
ptr
的分段错误是完全正常的,正如您所做的那样不必要地取消引用
null

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

int_ptr my_int_ptr();

这行代码的作用与您认为的不同。您正在向前声明一个名为
my_int_ptr
的函数,该函数返回
int_ptr
,而不是声明
int_ptr

的默认初始化实例。是的,它是“垃圾”。From:“如果存储的指针为
null
,则行为未定义”如果继续使用此共享指针(或从中创建的其他共享指针),就好像它是有效的,这将导致更多问题。是的,这是“垃圾”。from:“如果存储的指针为
null,则行为未定义”
“继续使用此共享指针(或从中创建的其他共享指针)如果它是有效的,将导致更多的问题。是的。我的错,我声明了一个名为my_int_ptr的函数,它返回int_ptr。我将它视为一个对象。现在更正语法将导致分段错误。是的。我的错,我声明了一个名为my_int_ptr的函数,它返回int_ptr。我将它视为一个对象。更正t他现在的语法导致了分词错误。。