【发布时间】:2013-06-08 23:11:05
【问题描述】:
我刚开始使用 C++ 并试图了解智能指针。显然,下面的代码会崩溃(我想是因为赋值创建了 shared_ptr 的副本?)。有没有办法通过在ptrs[3] 上调用某种设置方法来保持foo.Other 的更新?
class Foo
{
public:
int X;
std::shared_ptr<Foo> Other;
Foo() : X(10) { }
};
int main()
{
Foo foo;
std::vector<std::shared_ptr<Foo>> ptrs(10);
foo.Other = ptrs[3];
std::shared_ptr<Foo> other = std::shared_ptr<Foo>(new Foo());
ptrs[3] = other;
std::cout << foo.Other->X << std::endl; // throws Access violation exception
return 0;
}
编辑: 这是我得到的异常,因为它指向 null:
Test.exe 中 0x01219AEF 的第一次机会异常:0xC0000005:访问冲突读取位置 0x00000000。 Test.exe 中 0x01219AEF 处未处理的异常:0xC0000005:访问冲突读取位置 0x00000000。
【问题讨论】:
-
您绝对应该做的一件事是使用
std::make_shared而不是std::shared_ptr<Foo>(new Foo())
标签: c++ shared-ptr smart-pointers