问题标签 [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.
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
,从那里开始似乎是无效的。这是故意的吗?这意味着在移动指针时必须非常小心,因为可能会破坏另一个对象!
你怎么看?我该如何保护自己免受这种伤害?
谢谢,史蒂芬
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 的期望过高?
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
,即找不到条目,虽然我之前已经添加了它。
c++ - unique_ptr 设置
我有以下情况:
但我需要更改它,因为指针现在可能是两种类型之一,但如果我这样做:
它无法编译,因为 a 超出范围。
我试过
但这失败了,因为需要使用不是来自基类的成员函数,而且我无权访问基类的代码。
必须有一种优雅的方式来解决这个问题,但我看不到它,你能吗?
c++ - 附加调试器时,unique_ptr dtor 调用速度非常慢(msvc)
我正在使用 VS2010,发现了一些可笑的性能问题。上面的代码在调试和发布版本 (ctrl+f5) 中运行良好,但是当附加调试器时 (f5),dtor 对 unique_ptr 类的调用速度非常慢。结果机器代码已经相当优化,所以我不认为这是编译器问题而不是调试器问题,但我不知道如何处理它。我的问题是
- 这个问题能在你的机器上重现吗?
- 这种行为的原因是什么?
- 有什么解决方法吗?
c++ - std::unique_ptr::get 有什么意义
首先不会std::unique_ptr::get
破坏拥有 unique_ptr 的目的吗?我本来希望这个函数改变它的状态,所以它不再持有指针。std::unique_ptr::get 有实际有用的用途吗?
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 的情况下都有效?如果可能的话,我想避免配置检查,然后像下面这样的宏(我认为它会起作用)
还是这是获得我正在寻找的行为的唯一方法?
c++ - unique_ptr 的动态转换
与 Boost 中的情况一样,C++11 提供了一些用于强制转换的函数shared_ptr
:
但是,我想知道为什么unique_ptr
.
考虑以下简单示例:
有什么理由不鼓励这种使用模式,因此shared_ptr
没有提供与中存在的功能等效的功能unique_ptr
?
c++ - 单元测试、模拟和 unique_ptr
有一个正在测试的类当前unique_ptr< Interface >&&
在其构造函数中接受 a ,以表示它希望获得接口实现的单一所有权。当想要使用模拟来测试这个类时会出现问题Interface
:模拟框架(HippoMocks)只给我Interface*
我不拥有的,因此不能删除。
在测试作为参数的类之前,我遇到了同样的问题const shared_ptr< Interface >&
,但通过提供自定义无操作删除器解决了这个问题:
unique_ptr 的类似修复并没有真正奏效,因为删除器是模板参数:
有解决方法吗?或者我不应该首先在这里使用 unique_ptr 吗?
更新 我试了一下;应该可以工作,但 sizeof( ptr ) 现在是 8,很难说它有什么影响。
c++ - 将 boost 的 multi_array 和 optional 与 C++11 unique_ptr 混合不起作用
我已经用 G++ 4.7 组合了一个最前沿的设置(尽管目前我仍在使用sudo apt-get boost-all-dev
Debian 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 的议程上支持?有时间表吗?在此期间我可以使用任何简单的解决方法吗?