我在这些项目中看到这些指针类的情况混合在一起。
有时他们使用std:unique_ptr,shared_ptr,有时候我会看到Microsoft :: WRL :: ComPtr。
只是想知道差异是什么,我怎么知道使用哪个?
答案 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.
}