2014-03-25 39 views
1

为什么下面的代码产生一个SIGABRT?我认为这是shared_ptr背后的全部想法,是你可以共享所有权。两个std :: shared_ptr运行时错误

#include<iostream> 
#include<memory> 
void func1() 
{ 
    int* i = new int (10); 
    std::shared_ptr<int> sp1 (i); 
    std::shared_ptr<int> sp2 (i); 
} 

int main() 
{ 
    func1(); 
    return 0; 
} 

回答

4

因为你有两个不同的共享指针,每个都有自己的引用计数,但指向相同的数据。

这意味着两者都会尝试删除相同的指针。

你应该与第一初始化第二指针:

std::shared_ptr<int> sp1(new int[10]); 
std::shared_ptr<int> sp2 = sp1; 

现在,这两个共享指针是真正共享。

+0

那么为什么'std :: shared_ptr sp2 = std :: make_shared (sp1);'不工作? – wizurd

+0

@wizurd因为它仍然产生一个新的唯一的“共享”指针,所以你仍然有两个不同的共享指针指向同一个对象,每个指针都有自己的引用计数器。 –