shared_ptr的基本语法问题

时间:2010-12-01 09:11:02

标签: c++

我是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";

3 个答案:

答案 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

  1. 某些(所有?)实现对构造的对象和计数器/删除器使用一个内存分配。这样可以提高性能。

  2. 它的例外是安全的,考虑一个带有两个shared_ptrs的函数:

    f(shared_ptr<A>(new A), shared_ptr<B>(new B));
    

    由于未定义评估顺序,因此可能的评估可能是:构造A,构造B,初始化share_ptr<A>,初始化shared_ptr<B>。如果B抛出,你就会泄漏A.

  3. 责任分离。如果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();