Tag: unique ptr

C ++ std :: unique_ptr:为什么lambdas没有任何大小的费用?

我正在阅读“Effective Modern C ++”。 在与std::unique_ptr相关的项目中,声明如果定制删除器是一个无状态对象,则不会发生大小的费用,但是如果它是一个函数指针或std::function大小的费用发生。 你能解释一下为什么? 假设我们有以下代码: auto deleter_ = [](int *p) { doSth(p); delete p; }; std::unique_ptr<int, decltype(deleter_)> up(new int, deleter_); 据我的理解, unique_ptr应该有一个types为decltype(deleter_)的对象,并为该内部对象分配deleter_ 。 但显然这不是发生了什么事情。 你可以用最小的代码示例来解释这个机制吗?

std :: unique_ptr :: get有什么意义呢?

不std::unique_ptr::get一个unique_ptr在第一个地方的目的? 我会期望这个函数改变它的状态,所以它不再有指针。 是否有一个std :: unique_ptr :: get的实际有用的使用?

将std :: unique_ptr <Derived>转换为std :: unique_ptr <Base>

比方说,我有工厂函数处理基类和派生类: #include <memory> using namespace std; struct B { virtual ~B() {} }; struct D : B {}; unique_ptr<B> MakeB() { auto b = unique_ptr<B>( new B() ); return b; // Ok! } unique_ptr<B> MakeD() { auto d = unique_ptr<D>( new D() ); return d; // Doh! } 在上面的最后一行,我需要move(d)为了使其工作,否则我得到“错误:从std::unique_ptr<D>无效转换为std::unique_ptr<D>&& 。 我的直觉说,在这种情况下,编译器应该知道它可以隐含地将一个右值赋给基指针,但是它不会。 这是不符合我的编译器(gcc 4.8.1和VS2012)? unique_ptr的预期devise? 标准中的缺陷?

前向声明与unique_ptr?

我发现使用类的前向声明与std::unique_ptr结合使用是很有用的,如下面的代码所示。 它编译和GCC工作,但整个事情似乎有点奇怪,我不知道这是标准的行为(即标准所要求的)? 因为当我声明unique_ptr时B不是一个完整的types。 A.hpp #include <memory> class B; class A { std::unique_ptr<B> myptr; // B::~B() can't be seen from here public: ~A(); }; A.cpp #include "B.hpp" //B.hpp has to be included, otherwise it doesn't work. A::~A() = default; // without this line, it won't compile // however, any destructor definiton will do. 我怀疑这与析构函数有关(因此需要调用unique_ptr<B>的析构函数)是在特定的编译单元(A.cpp)中定义的。

std :: unique_ptr的用法

std::unique_ptr<int> p1(new int); std::unique_ptr<int> p2(new int); p2=p1; 在这里似乎p1不再是“唯一的”,因为p2也是指它 这是合法的C ++? unique_ptr是否有copy_semantics? 如果不是,并且只有移动语义,则在将其分配给p2后将p1设置为NULL? 编辑: 好的,所以正确的版本是 p2=std::move(p1) 据此,在这个分配之后,p1是无效的? 和auto_ptr的区别在这里? 我认为明确地明确所有权的转移是比auto_ptr更为安全

从队列中删除unique_ptr

我想弄清楚如何在queue使用unique_ptr 。 // create queue std::queue<std::unique_ptr<int>> q; // add element std::unique_ptr<int> p (new int{123}); q.push(std::move(p)); // try to grab the element auto p2 = foo_queue.front(); q.pop(); 我明白为什么上面的代码不起作用。 由于front和front是两个独立的步骤,因此元素不能移动。 有没有办法做到这一点?

那么unique_ptr可以安全地在stl集合中使用吗?

我与unique_ptr和右值移动哲学混淆。 假设我们有两个集合: std::vector<std::auto_ptr<int>> autoCollection; std::vector<std::unique_ptr<int>> uniqueCollection; 现在我期望下面的失败,因为没有告诉内部的algorithm是什么,也许做内部枢纽副本之类的东西,从而剥夺了auto_ptr的所有权: std::sort(autoCollection.begin(), autoCollection.end()); 我明白了 编译器正确地禁止这种情况发生。 但是,我这样做: std::sort(uniqueCollection.begin(), uniqueCollection.end()); 这个编译。 我不明白为什么。 我不认为unique_ptrs可以被复制。 这是否意味着一个枢轴值不能被采取,所以sorting效率较低? 或者这个枢轴实际上是一个移动,事实上,它与auto_ptrs的集合一样危险,应该被编译器所禁止? 我想我错过了一些关键的信息,所以我急切地等待有人给我提供啊哈! 时刻。

我应该使用shared_ptr还是unique_ptr

我一直在使用pimpl习语做一些对象,但我不确定是否使用std::shared_ptr或std::unique_ptr 。 我明白, std::unique_ptr更有效率,但这对我来说并不是什么大问题,因为无论如何这些对象都是相对重量级的,所以std::shared_ptr超过std::unique_ptr的代价相对较小。 我目前正在与std::shared_ptr只是因为额外的灵活性。 例如,使用std::shared_ptr允许我将这些对象存储在散列表中以便快速访问,同时仍然可以将这些对象的副本返回给调用者(因为我相信任何迭代器或引用可能会很快变得无效)。 然而,这些对象实际上并没有被复制,因为变化会影响到所有的副本,所以我想知道,也许使用std::shared_ptr并允许副本是某种反模式或坏东西。 它是否正确?

将unique_ptr传递给函数

我试图“现代化”一些现有的代码。 我有一个类,目前有一个成员variables“设备*设备_”。 它使用new在某些初始化代码中创build一个实例,并在结构中有一个“delete device_”。 这个类的成员函数调用许多其他的以Device *为参数的函数。 这很好,但为了“代码化”我想我应该改变variables定义为"std::unique_ptr<Device> device_"并删除显式调用删除,这使得代码更安全,通常更好。 我的问题是这个 – 那么我应该如何将设备 _variables传递给所有需要它作为参数的函数呢? 我可以调用.get来获取每个函数调用中的原始指针。 但是,这似乎是丑陋的,浪费了一些使用unique_ptr的原因。 或者我可以改变每一个函数,而不是采取“Device *”types的参数,现在它需要一个types为“std :: unique_ptr&”的参数。 哪(对我)有点混淆函数原型,并使他们难以阅读。 这个最好的做法是什么? 我错过了其他select吗?

为unique_ptrdynamic投射

正如Boost中的情况一样,C ++ 11提供了一些用于强制shared_ptr函数: std::static_pointer_cast std::dynamic_pointer_cast std::const_pointer_cast 不过,我想知道为什么没有unique_ptr等价函数。 考虑以下简单的例子: class A { virtual ~A(); … } class B : public A { … } unique_ptr<A> pA(new B(…)); unique_ptr<A> qA = std::move(pA); // This is legal since there is no casting unique_ptr<B> pB = std::move(pA); // This is not legal // I would like to do something […]