This question already has an answer here:
shared_ptr vs CComPtr
(1个答案)
6年前关闭。
我正在这些项目中看到这些指针类混合在一起的情况。
有时他们使用std:unique_ptr,shared_ptr,有时我看到Microsoft::WRL::ComPtr。
只是想知道差异是什么,我怎么知道该使用哪个?
不会编译,但是
将。
您不一直使用
举个例子
比将原始指针移动到新指针中(可能要慢很多),因为编译器必须跟踪指向该对象的
至于
编辑
为了显示这些不同的智能指针的优缺点,以及当您应该选择它们时,确实需要一个不错的示例程序。所以,你去!
(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