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

最佳答案

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的显式调用更受青睐:
  • 一些(全部?)实现为构造的对象和计数器/分发程序使用一种内存分配。这样可以提高性能。
  • 异常(exception)安全,考虑一个带有两个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负责删除,则也使其负责分配。
  • 关于c++ - shared_ptr的基本语法问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4322730/

    10-10 01:14