问题标签 [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 投票
2 回答
5350 浏览

c++ - 带有 unique_ptr 和 shared_ptr 的奇怪段错误

我遇到了一个奇怪的段错误。原因实际上导致了我的一个错误,但我仍然不明白为什么这里会导致分段错误......代码是:

我用 g++ 4.6 编译-std=c++0x并得到一个段错误。

如果我将第 7 行更改为u2 = std::move(u1);(那是错误),它就会消失。如果我将第 8 行更改为std::shared_ptr<int> s1(new int(3));(当然我不想要),它也会消失。如果我从第 8 行删除也没有段错误。

所以没有伤害,但我不明白为什么会有段错误。据我了解,
在第 7 行,一个空指针被分配给 u1。没有reset(),没有范围的结束。尽管如此i,从那里开始似乎是无效的。这是故意的吗?这意味着在移动指针时必须非常小心,因为可能会破坏另一个对象!

你怎么看?我该如何保护自己免受这种伤害?

谢谢,史蒂芬

0 投票
2 回答
543 浏览

c++ - std::unique_ptr ostream 插入器

我使用 -std=c++0x 选项在 gcc 4.4.6 中启用了 unique_ptr。它似乎工作得很好,正是我所需要的——一个带有自定义删除器的作用域指针。

但是我确实注意到了一个问题。

显示:ptr1 指向 1 ptr2 指向 1

我认为 ostream 插入器正在插入 bool 值。

以下修复了它,但我想知道这是否不应该成为标准库的一部分。

所以问题是:这是 gcc 中当前 unique_ptr 实现的限制,还是我对 unique_ptr 的期望过高?

0 投票
1 回答
3010 浏览

c++ - 将 unique_ptr 插入地图,指针被破坏

我有以下(简化)类:

插入新Operand作品没有任何问题。但是,当函数返回时,析构函数被调用,因此map调用时不包含任何对象setOperandsValue。我使用 DDD 观察到了这一点:在末尾insertOperand Operator::~Operator()被调用。

在查看Using std::unique_ptr with STL之后,我介绍了(更好:使用过)std::move,但要么没有正确放置,要么我遗漏了一些东西(很可能由于缺乏知识)。我没有使用map::emplace,因为它不可用。

编辑:析构函数调用是有效的,因为它正在破坏new T(o). 无论如何,map进入时仍然是空的setOperandsValue

编辑#2:在输入setOperandsValue和执行op.find(o)结果是op.end,即找不到条目,​​虽然我之前已经添加了它。

0 投票
3 回答
277 浏览

c++ - unique_ptr 设置

我有以下情况:

但我需要更改它,因为指针现在可能是两种类型之一,但如果我这样做:

它无法编译,因为 a 超出范围。

我试过

但这失败了,因为需要使用不是来自基类的成员函数,而且我无权访问基类的代码。

必须有一种优雅的方式来解决这个问题,但我看不到它,你能吗?

0 投票
1 回答
355 浏览

c++ - 附加调试器时,unique_ptr dtor 调用速度非常慢(msvc)

我正在使用 VS2010,发现了一些可笑的性能问题。上面的代码在调试和发布版本 (ctrl+f5) 中运行良好,但是当附加调试器时 (f5),dtor 对 unique_ptr 类的调用速度非常慢。结果机器代码已经相当优化,所以我不认为这是编译器问题而不是调试器问题,但我不知道如何处理它。我的问题是

  • 这个问题能在你的机器上重现吗?
  • 这种行为的原因是什么?
  • 有什么解决方法吗?
0 投票
6 回答
48395 浏览

c++ - std::unique_ptr::get 有什么意义

首先不会std::unique_ptr::get破坏拥有 unique_ptr 的目的吗?我本来希望这个函数改变它的状态,所以它不再持有指针。std::unique_ptr::get 有实际有用的用途吗?

0 投票
1 回答
2968 浏览

c++ - unique_ptr、nullptr 并支持 gcc 4.5.x 和 4.6.x

我正在开发一个有两个不同最终用户的库,其中一个正在使用 gcc 4.5.3,另一个刚刚移到 gcc 4.6.3。该库使用新的 C++11 智能指针(特别是 unique_ptr)并在 gcc 4.5.3 上编译良好。但是,在这两个版本之间,gcc 开始支持 nullptr,因此 unique_ptr 的 API 发生了变化,以更接近标准。现在这样做,以下代码从精细变为模棱两可

是否有一种干净的(即下一句)方法来更改上面的 if 语句,以便它在有和没有 nullptr 的情况下都有效?如果可能的话,我想避免配置检查,然后像下面这样的宏(我认为它会起作用)

还是这是获得我正在寻找的行为的唯一方法?

0 投票
9 回答
40181 浏览

c++ - unique_ptr 的动态转换

与 Boost 中的情况一样,C++11 提供了一些用于强制转换的函数shared_ptr

但是,我想知道为什么unique_ptr.

考虑以下简单示例:

有什么理由不鼓励这种使用模式,因此shared_ptr没有提供与中存在的功能等效的功能unique_ptr

0 投票
4 回答
4735 浏览

c++ - 单元测试、模拟和 unique_ptr

有一个正在测试的类当前unique_ptr< Interface >&&在其构造函数中接受 a ,以表示它希望获得接口实现的单一所有权。当想要使用模拟来测试这个类时会出现问题Interface:模拟框架(HippoMocks)只给我Interface*我不拥有的,因此不能删除。

在测试作为参数的类之前,我遇到了同样的问题const shared_ptr< Interface >&,但通过提供自定义无操作删除器解决了这个问题:

unique_ptr 的类似修复并没有真正奏效,因为删除器是模板参数:

有解决方法吗?或者我不应该首先在这里使用 unique_ptr 吗?

更新 我试了一下;应该可以工作,但 sizeof( ptr ) 现在是 8,很难说它有什么影响。

0 投票
0 回答
787 浏览

c++ - 将 boost 的 multi_array 和 optional 与 C++11 unique_ptr 混合不起作用

我已经用 G++ 4.7 组合了一个最前沿的设置(尽管目前我仍在使用sudo apt-get boost-all-devDebian Wheezy 附带的 boost 1.48)。

我的代码设置在要使用的逻辑数据结构是 unique_ptr 的多维数组的地方。但是multi_array,如果其中有一个 unique_ptr ,似乎甚至无法构造一个空的单元素数组。因此这是有效的:

但这不会:

我想编译器的相关抱怨是:

/usr/include/c++/4.7/bits/stl_uninitialized.h:225: 来自 'void std::uninitialized_fill_n(_ForwardIterator, _Size, const _Tp&) [with _ForwardIterator = std::unique_ptr*; _Size = 无符号整数;_Tp = std::unique_ptr]'</p>

optional< unique_ptr<...> >即使我应用了此处提供的补丁,我也遇到了一些问题:

https://svn.boost.org/trac/boost/ticket/1841

(注意:通过Is it possible to move a boost::optional 找到的?

例如:

我觉得我在做的事情是合法的。事实上,通过将 unique_ptr 合并到这个项目中,我已经在所有权转移语义方面发现了一些错误。所以我不想说“哦,这太复杂了,只需使用原始指针”

这是否在 boost 的议程上支持?有时间表吗?在此期间我可以使用任何简单的解决方法吗?