shared_ptr的基本语法问题

Les*_*ieg 6 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";
Run Code Online (Sandbox Code Playgroud)

ybu*_*ill 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();
Run Code Online (Sandbox Code Playgroud)

编辑:只是为了总结为什么make_shared首选显式调用new:

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

  2. 它是异常安全的,考虑一个带两个shared_ptrs的函数:

    f(shared_ptr<A>(new A), shared_ptr<B>(new B));
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. 分离责任.如果shared_ptr负责删除,也要负责分配.

  • @Fred:分离责任.`make_shared <>`允许库处理`new`,所以你的代码不会显示一个明显不平衡的`new`调用.库执行`delete`,所以它也应该执行`new`. (2认同)
  • Steven T. Lavavej在他关于STL(IIRC)的一次谈话中放弃了VC10 std :: make_shared <>在同一请求中分配内存和计数器,这不仅提供了少一个分配,而且还提供了一个位置参考是潜在的优化. (2认同)

Ben*_*oit 0

尝试ptr3.reset(NULL)