问题标签 [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++ - 处理 stl 容器中的智能指针
我有一个类,它有一个指向派生类Foo<T>
的智能指针向量。Shape
我正在尝试实现一个at(index)
成员函数。这是我直观地要做的事情:
定义at(index)
函数时,我收到编译器错误消息。请注意,已定义移动构造函数,并且 Shape 基类是抽象的。下面,我给出一些代码用于说明目的。
此外,我最近在网上找到了一个关于如何使用std::move
. 我通常遵循 Copy-Swap 习语。这两种重载上述运算符的方法中哪一种对我的情况有意义?下面,我还说明了函数的定义。
c++ - `unique_ptr< T const [] >` 是否应该接受 `T*` 构造函数参数?
代码:
Visual C++ 10.0 和 MinGW g++ 4.4.1 的示例错误:
在我看来,数组版本应该接受与非数组版本相同的隐式常量添加。
不同之处在于数组版本不应该接受指向派生类的指针,而这显然是上面的机制。
代码有效吗?
如果代码在形式上无效,标准的措辞是否反映了意图(即,DR 是否合适)?
如果第一个否定,第二个否定,意图是否有缺陷(即,DR 是否合适)?
c++ - 为原始指针(如所有权语义)返回 unique_ptr 的坏习惯?
我编写了一个静态工厂方法,它返回一个从另一个数据对象填充的新 Foobar 对象。我最近一直沉迷于所有权语义,想知道我是否通过让这个工厂方法返回一个unique_ptr
.
我的意图是告诉客户端代码他们拥有指针。如果没有智能指针,我只会返回Foobar*
. 但是,我想强制删除此内存以避免潜在的错误,因此unique_ptr
似乎是一个合适的解决方案。如果客户端想要延长指针的生命周期,他们只需.release()
在获得unique_ptr
.
我的问题分为两部分:
- 这种方法是否传达了正确的所有权语义?
- 这是返回
unique_ptr
而不是原始指针的“坏习惯”吗?
c++ - 什么时候将 unique_ptr 与 STL 容器一起使用才有意义?(C++11)
的容器unique_ptr
似乎没有什么意义:你不能将它与初始化列表一起使用,而且我无法遍历容器(下面的解决方法)。我是不是误会了什么?或者什么时候使用unique_ptr
STL 容器才有意义?
以下问题帮助我找到了这些解决方法:
c++ - 如何将 unique_ptr 的向量声明为类数据成员?
我想要一个 unique_ptr 的向量作为我正在制作的类的成员。
但随后我开始从VS2010编译器收到神秘的错误消息:
连同下面的一些错误行,这些错误行深入到 Microsoft 的实现std::_Copy_impl<>
...
我将成员声明更改为
它编译。但是我不禁想知道为什么我不能按照我最初想要的方式去做呢?对于笑容,我尝试了这个,它工作正常:
但是现在我失去了unique_ptr
. 我想要我的蛋糕,我也想吃!
c++ - 如何将 unique_ptr 用于 pimpl?
这是我尝试将 unique_ptr 用于 pimpl 时看到的简化。我选择 unique_ptr 是因为我真的希望类拥有指针 - 我希望 pimpl 指针和类的生命周期相同。
无论如何,这是标题:
这是来源:
我可以将它们编译成一个库就好了。但是当我尝试在测试程序中使用它时,我得到了
这是众所周知的安全功能。我试着跟了上去。
我的问题是,如果我将 Help::Impl 声明放在标题中,它似乎会消除 pimpl 的任何优势。类布局对用户可见。定义是隐藏的,但我可以使用 Help 类和私有成员来做到这一点。此外,包括 Impl 的声明带来了我希望分开的新标头。
我错过了什么?人们在 Impl 声明中添加了什么以及在哪里?我做错了 Help dtor 吗?啊!
c++ - 具有不完整类型的非共享智能指针
是否有一个标准指针类(或 Boost),它是一个适用于不完整类型的非共享指针?我已经查看了 C++11 标准和 boost 库,但找不到一个,尽管它似乎是一种非常有用的类型。
例如,我希望能够使用智能指针制作不透明类型。
A
是一种不透明类型,可用于多种功能。上述接口的用户只有一个不完整的 A 定义,但应该能够删除/重置指针。我知道上面可以用 a 来完成,shared_ptr
但是在这个特定的代码中我不想要这样的开销。unique_ptr
具有正确的所有权语义,但不能使用不完整的类型。理论上,包装器应该只需要具有指向删除器的指针的开销。
C++11 或 boost 库中是否有这种类型?
注意:我知道我可以轻松构建这种类型,但如果可能的话,我更喜欢标准类型。看起来它应该是一种基本的智能指针类型。
更新:unique_ptr
似乎不是一个好的选择。首先,语法开销将被抵消。其次,我不相信它可以安全地与自定义删除器一起使用。我会检查它是如何工作的。
c++ - 在 C++11 中对数组进行简单范围管理的最简洁方法是什么
我正在寻找一种使用 C++11 中引入的新指针模板来管理数组范围的干净方法,这里的典型场景是调用 win32 api 函数时。
我在这里发帖是因为尽管有很多关于更复杂问题的讨论,但这个相对简单的场景似乎没有被讨论过,我想知道是否有比我现在开始做的更好的选择。
c++ - unique_ptr 总是指向同一个内存区域
考虑这段代码:
arr1 和 arr2 指向同一个内存区域。所以他们共享相同的价值观。我不明白为什么,当我调用 arr2=get() 时:
这个对象不应该再次创建吗?它没有被删除,因为仍然可以通过 arr1 访问。如何获得两个不同内存区域的数组?
c++ - stl 容器与 std::unique_ptr's vs boost::ptr_container
有了 c++11,我问自己是否可以替换 c++11 中的 boost::ptr_containers。我知道我可以使用例如 a std::vector<std::unique_ptr<T> >
,但我不确定这是否是一个完整的替代品。处理这些情况的推荐方法是什么?