C ++ Microsoft的ComPtr和c ++ unique_ptr,shared_ptr有什么区别?

时间:2014-11-06 02:50:03

标签: c++ c++11

我在这些项目中看到这些指针类的情况混合在一起。

有时他们使用std:unique_ptr,shared_ptr,有时候我会看到Microsoft :: WRL :: ComPtr。

只是想知道差异是什么,我怎么知道使用哪个?

1 个答案:

答案 0 :(得分:2)

std::unique_ptr表示指向对象的唯一指针,这样您就无法复制指针;但你仍然可以移动指针。

e.g。

auto ptr = std::make_unique<float>(5.0f);
std::unique_ptr other_ptr = ptr;

不会编译,但

auto ptr = std::make_unique<float>(5.0f);
std::unique_ptr other_ptr = std::move(ptr);

意愿。


std::shared_ptr表示指向多个其他shared_ptr可能指向的对象的指针。它是可复制的和可移动的。

你不会shared_ptr一直使用unique_ptr的原因是shared_ptr在构造和解构时会变慢,而且只要你需要将它传递给函数,你可能会导致这种缓慢的(de)建设。

作为例子

auto ptr = std::make_shared<float>(5.0f);
std::shared_ptr other_ptr = ptr;

(可能很多)比将原始指针移动到新指针要慢,因为编译器必须跟踪有多少shared_ptr个实例指向该对象,以便当shared_ptr为de时-constructed如果它是该对象的最后一个指针,它将删除它。


至于ComPtr ...请不要使用它,除非绝对必要。这几乎从来没有。您可能在您引用的项目中看到它的原因是某些Microsoft特定的API使用它,这是您必须使用它的时间之一。


修改

为了展示这些不同智能指针的优点和/或缺点,以及何时应该选择它们,真正需要一个不错的示例程序。所以,你走了!

void f(std::unique_ptr<float> p){}
void f(std::shared_ptr<float> p){}

void g(std::unique_ptr<float> &p){}
void g(std::shared_ptr<float> &p){}

int main(int argc, char *argv[]){
    auto uptr = std::make_unique<float>(6.9f);
    auto sptr = std::make_shared<float>(4.20f);

    // f(uptr);
    // error, trying to make a copy of a unique_ptr

    f(sptr);
    // fine, shared_ptr may be copied

    f(std::make_unique<float>(6.9f));
    f(std::make_shared<float>(4.20f));
    // both fine, value initialized in function call and moved into function.

    g(uptr);
    g(sptr);
    // both fine, shared and unique pointers may be passed by reference
    // as no copy or move is made.
}