2017-08-01 108 views
0

为了理解shared_ptr在原始指针上的行为,试图用好奇心来试验这个程序。我希望这个问题能够双删除,但在这里我面对其他:shared_ptr reset抛出分段错误

MyClass *raw_ptr = new MyClass(); 
shared_ptr<MyClass> sptr1(raw_ptr); 
shared_ptr<MyClass> sptr2 = sptr1; 
cout << sptr1.use_count() << endl; // prints 2 
sptr1.reset(); // occurs Segmentation Fault here 

预期行为:减少数为1,控制移动到下一行。

解决:实际问题出现在下一行,其中sptr1访问公共类成员MyClass :: a,这是复位后的无效访问,因此是段错误。困惑,因为它没有打印cout消息。

cout << "count: "<< sptr1.use_count() 
    << "value: "<< sptr1->a; 
+1

适用于我:http://coliru.stacked-crooked.com/a/5d0f9a81c10e187c –

+0

当你调用'reset()',或者当'sptr2'超出范围时,你确定会发生异常吗? MyClass对象正在被删除?分段错误可能发生在其析构函数中。 –

+0

对不起,我感到困惑。错误是在我的代码中,我正在调用类的成员使用sptr1后立即复位,这导致段错误。谢谢 – Eddy

回答

1

该代码没有问题。这很好。

因此,无论是你的编译器坏了,你的开发环境坏了,还是有其他的代码,你没有向我们展示哪些是导致崩溃的原因。

+0

实际的错误是在我的代码的下一行。我试图在重置后使用sptr1访问MyClass成员。这是坠机的原因。谢谢。 – Eddy