问题标签 [unique-ptr]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
10073 浏览

c++ - 关于 unique_ptr 表演

我经常读到 unique_ptr 在大多数情况下比 shared_ptr 更受欢迎,因为 unique_ptr 是不可复制的并且具有移动语义;由于复制和引用计数,shared_ptr 会增加开销;

但是当我在某些情况下测试 unique_ptr 时,它似乎比它的对应物慢得多(在访问中)

例如,在gcc 4.5下:

编辑:打印方法实际上不打印任何东西

平均而言,我得到 (g++ -O0) :

  • shared_ptr : 1480 微秒
  • unique_ptr : 3350 微秒

差异来自哪里?可以解释吗?

0 投票
2 回答
31967 浏览

c++ - boost::scoped_ptr 之间的区别和 std::unique_ptr

具有移动语义而仅仅是获取/重置智能指针的唯一区别boost::scoped_ptr<T>std::unique_ptr<T>事实是什么?std::unique_ptr<T>boost::scoped_ptr<T>

0 投票
5 回答
42518 浏览

c++ - 如何将 unique_ptr 捕获到 lambda 表达式中?

我尝试了以下方法:

但它不编译。有任何想法吗?

更新:

正如建议的那样,需要一些新的语法来明确指定我们需要将所有权转移给 lambda,我现在正在考虑以下语法:

会是一个很好的候选人吗?

更新 1:

我将展示我的实现,move如下copy所示:

0 投票
2 回答
32880 浏览

c++ - 遍历 unique_ptr 的容器

如何访问容器的 unique_ptr 元素(通过迭代器)而不剥夺容器的所有权?当一个人获得容器中元素的迭代器时,元素所有权仍然在容器中吗?当一个人取消引用迭代器以获得对 unique_ptr 的访问时怎么样?这会执行 unique_ptr 的隐式移动吗?

我发现当我需要将元素存储在容器中(而不是按值)时,我经常使用 shared_ptr,即使容器在概念上拥有元素并且其他代码只是希望操纵容器中的元素,因为我害怕如果没有从容器中获取所有权,则无法实际访问容器中的 unique_ptr 元素。

有什么见解吗?

0 投票
4 回答
41112 浏览

c++ - std::unique_ptr 的自定义删除器如何工作?

根据 N3290,std::unique_ptr在其构造函数中接受一个删除器参数。

但是,我无法在 Windows 中使用 Visual C++ 10.0 或 MinGW g++ 4.4.1,也无法在 Ubuntu 中使用 g++ 4.6.1。

因此,我担心我对它的理解是不完整或错误的。我看不出明显被忽略的删除参数的意义,所以任何人都可以提供一个有效的例子吗?

最好我也想看看它是如何工作的unique_ptr<Base> p = unique_ptr<Derived>( new Derived )

可能使用标准中的一些措辞来支持示例,即无论您使用什么编译器,它实际上都在做它应该做的事情?

0 投票
3 回答
1585 浏览

c++ - std::unique_ptr 是底层对象的两倍

我遇到了 std::unique_ptrs 的问题(特别是 MSFT VS 10.0 的实现)。当我创建它们的 std::list 时,我使用的内存是创建仅包含底层对象的 std::list 时的两倍(注意:这是一个大对象——~200 字节,所以它不仅仅是一个周围有额外的参考计数器)。

换句话说,如果我运行:

我的应用程序需要的内存是我运行时的一半:

我已经检查了 MSFT 的实现,但没有看到任何明显的东西——有人遇到过这种情况并有任何想法吗?

编辑: 好的,更清楚/具体一点。这显然是一个 Windows 内存使用问题,我显然遗漏了一些东西。我现在尝试了以下方法:

  1. 创建一个std::list100000 MyObj
  2. 创建一个std::list100000 MyObj*
  3. 创建一个std::list100000 int*
  4. 创建一个std::list50000 int*

在每种情况下,列表的每个 add'l 成员,无论是指针还是其他,都会使我的应用程序膨胀4400(!) bytes。这是一个 64 位版本的版本,不包含任何调试信息(链接器 > 调试 > 生成调试信息设置为否)。

我显然需要对此进行更多研究,以将其缩小到较小的测试用例。

对于那些感兴趣的人,我正在使用Process Explorer确定应用程序的大小。

原来这完全是堆碎片。多么可笑。每个 8 字节对象 4400 字节!我切换到预分配,问题完全消失了——我习惯了依赖每个对象分配的效率低下,但这太荒谬了。

MyObj 实现如下:

0 投票
3 回答
889 浏览

c++ - 传递 unique_ptrs 数组的正确方法是什么?

如果我不想要副本,这是传递一组 unique_ptrs 的正确方法吗?

换句话说,我希望 x 发生的所有事情都会影响调用者中的 arr。

0 投票
1 回答
402 浏览

c++ - C++ 将 unique_ptrs 的向量作为参数传递给另一个等长向量的对应元素(尤其是并行)

我有:

  • unique_ptrObjectA 的 s向量

  • ObjectB 的新默认构造向量的向量,以及

  • 对象 B 中具有签名的函数void f(unique_ptr<ObjectA> o)

(从这里省略词对象)

我如何并行Bvec[i].f(Avec[i])处理所有问题?0 < i < length

我试过使用transform(Bvec.begin(), Bvec.end(), A.begin(), B.begin(), mem_fun_ref(&B::f)),但它给出了一堆错误,我不确定它是否会传递正确的 A 作为参数,更不用说让我移动它们了。 (&B::f(A.begin())也不能作为最后一个参数。

我也想过使用 for_each 然后使用 lambda 函数,但不知道如何获取相应的元素。我想增加一个计数器,但后来我认为并行化不好(我可能是错的)。

当然,我可以使用从 0 到结束的 for 循环,但我很确定我缺少一个简单的东西,它与简单的 for 循环不平行。

谢谢。

0 投票
1 回答
1282 浏览

c++ - unique_ptr C++03 仿真中的 move 函数

我试图了解如何实现unique_ptr 的 C++03 仿真。unique_ptr 很像 std::auto_ptr 但更安全。在 auto_ptr 隐式转移所有权(即,静默)的情况下,它会吐出编译器错误。例如,一个简单的分配。功能move是模拟 unique_ptr 安全性的关键。

问题:

  1. 为什么有三个移动功能?
  2. 第三个移动函数接受引用并将其转换为右值,实现(简化)如下。

    /li>

在上面的代码中,对 T 的显式转换似乎是不必要的。事实上,Visual Studio 2010 在没有显式转换为 T 的情况下非常满意。

但是,g++、clang、Comeau 不喜欢第二个版本。这些编译器抱怨没有构造函数unique_ptr<T>作为detail_unique_ptr::rv<T>参数。这是为什么?detail_unique_ptr::rv<T>unique_ptr 已经定义了一个作为参数的(非显式)构造函数。为什么不自动捡起那个?

0 投票
2 回答
349 浏览

c++ - 在这种情况下,unique_ptr 的行为应该是什么?

说我有以下内容:

在这个复杂的例子中,应该是什么行为pA(new A);

据我所知,在 MSVC2010 中,void operator()(T*) const;从 default_delete 在new返回后立即调用并立即删除指针。而 g++(4.7.0) 给了我no match for call (std::unique_ptr<A>)(A*)错误。