我是shared_ptr的新手。我有几个关于C ++ 0x shared_ptr语法的问题如下:
//first question
shared_ptr<classA>ptr(new classA()); //works
shared_ptr<classA>ptr;
ptr = ?? //how could I create a new object to assign it to shared pointer?
//second question
shared_ptr<classA>ptr2; //could be tested for NULL from the if statement below
shared_ptr<classA> ptr3(new classA());
ptr3 = ?? //how could I assign NULL again to ptr3 so that the if statement below becomes true?
if(!ptr3) cout << "ptr equals null";
答案 0 :(得分:10)
shared_ptr<classA> ptr;
ptr = shared_ptr<classA>(new classA(params));
// or:
ptr.reset(new classA(params));
// or better:
ptr = make_shared<classA>(params);
ptr3 = shared_ptr<classA>();
// or
ptr3.reset();
修改:只是总结为什么make_shared
首选显式调用new
:
某些(所有?)实现对构造的对象和计数器/删除器使用一个内存分配。这样可以提高性能。
它的例外是安全的,考虑一个带有两个shared_ptrs的函数:
f(shared_ptr<A>(new A), shared_ptr<B>(new B));
由于未定义评估顺序,因此可能的评估可能是:构造A,构造B,初始化share_ptr<A>
,初始化shared_ptr<B>
。如果B抛出,你就会泄漏A.
责任分离。如果shared_ptr
负责删除,也要对分配负责。
答案 1 :(得分:0)
尝试ptr3.reset(NULL)
答案 2 :(得分:0)
我怎样才能创建一个新对象 将它分配给共享指针?
您必须“重置”共享指针:
classA* my_pointer = new classA();
shared_ptr<classA>ptr;
ptr.reset( my_pointer );
我怎么能再次为ptr3分配NULL 以便下面的if语句成为 真?
再次,通过使用重置但没有参数(或null)
ptr3.reset();