智能指针的效率如何?

kri*_*pet 3 c++ pointers std c++11

我知道,它std::shared_ptr使用引用计数,因此它具有复制和移动语义,另一方面std::unique_ptr(因此名称唯一)只有移动语义,因此尝试复制它是一个编译错误.

然而,对我而言,它并不十分清楚.我可以简单地使用std::shared_ptrstd::unique_ptr在大多数情况下,还是应该用std::unique_ptr尽可能因为它更有效,因为它没有照顾引用计数?

另外,我知道智能指针在处理时非常有用,例如异常安全,但它们通常会取代传统的T*指针吗?尽可能使用智能指针而不是传统T*指针是一种很好的编程习惯吗?

Nem*_*vic 5

经验法则是:

  1. 如果可以,可以直接使用基于堆栈的对象,也可以使用引用而不是使用指针.
  2. 否则,如果您不必处理共享所有权(通常不使用),则使用unique_ptr - 它不仅更快,而且更安全(没有循环引用).
  3. 否则,如果您确实拥有共享所有权,请使用shared_ptr

在某些情况下,当指针不带有所有权时,原始指针就可以了 - 例如作为函数的输入参数:

void draw (const shape* sh) {
    sh->draw();
}

...
std::unique_ptr<shape> ptr(new triangle);
draw(ptr.get());
Run Code Online (Sandbox Code Playgroud)