This question already has an answer here:
shared_ptr vs CComPtr

(1个答案)


6年前关闭。




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

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

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

最佳答案

std::unique_ptr表示指向对象的唯一指针,因此您无法复制该指针;但是您仍然可以移动指针。

例如

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会变慢,并且每次需要将其传递给函数时,都可能会导致这种缓慢的(解构)构造。

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

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

至于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.
}

关于c++ - C++ Microsoft的ComPtr与c++ unique_ptr,shared_ptr有什么区别? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26770933/

10-09 06:23