Questions tagged «unique-ptr»

std :: unique_ptr是一个智能指针,它通过指针保留对对象的唯一所有权。unique_ptr不可复制或不可分配,两个unique_ptr实例无法管理同一对象。

6
为什么在C ++ 17中使用std :: make_unique?
据我了解,C ++ 14的引入std::make_unique是因为,由于未指定参数求值顺序,因此这是不安全的: f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A (说明:如果评估首先为原始指针分配内存,然后进行调用,g()并且在std::unique_ptr构造之前引发异常,则内存将泄漏。) 呼叫std::make_unique是一种限制呼叫顺序的方法,从而使事情变得安全: f(std::make_unique<MyClass>(param), g()); // Syntax B 从那时起,C ++ 17阐明了评估顺序,也使语法A变得安全,所以这是我的问题:在C ++ 17中仍然有理由使用std::make_uniqueover std::unique_ptr的构造函数吗?你能举一些例子吗? 到目前为止,我能想象的唯一原因是它只允许键入MyClass一次(假设您不需要依赖于的多态性std::unique_ptr<Base>(new Derived(param)))。但是,这似乎是一个很弱的原因,尤其是当的构造函数std::make_unique不允许指定删除器时std::unique_ptr。 只是要清楚一点,我不主张std::make_unique从标准库中删除(至少保持向后兼容才有意义),而是想知道是否仍然存在强烈推荐使用标准库的情况。std::unique_ptr
96 c++  c++17  unique-ptr 

4
如何声明std :: unique_ptr,它的用途是什么?
我尝试了解其std::unique_ptr工作原理,并为此找到了本文档。作者从以下示例开始: #include <utility> //declarations of unique_ptr using std::unique_ptr; // default construction unique_ptr<int> up; //creates an empty object // initialize with an argument unique_ptr<int> uptr (new int(3)); double *pd= new double; unique_ptr<double> uptr2 (pd); // overloaded * and -> *uptr2 = 23.5; unique_ptr<std::string> ups (new std::string("hello")); int len=ups->size(); 让我感到困惑的是 unique_ptr<int> uptr …
95 c++  pointers  std  unique-ptr 

6
错误:: make_unique不是'std'的成员
我正在尝试编译代码审查中发布的以下线程池程序以对其进行测试。 /codereview/55100/platform-independant-thread-pool-v4 但是我得到了错误 threadpool.hpp: In member function ‘std::future<decltype (task((forward<Args>)(args)...))> threadpool::enqueue_task(Func&&, Args&& ...)’: threadpool.hpp:94:28: error: ‘make_unique’ was not declared in this scope auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>> (std::move(bound_task), std::move(promise)); ^ threadpool.hpp:94:81: error: expected primary-expression before ‘>’ token auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>>(std::move(bound_task), std::move(promise)); ^ main.cpp: In function ‘int main()’: main.cpp:9:17: error: …

4
为什么T *可以在寄存器中传递,但unique_ptr <T>无法传递?
我正在观看Chandler Carruth在CppCon 2019中的演讲: 没有零成本抽象 在该示例中,他举例说明了您对使用std::unique_ptr&lt;int&gt;over和会产生多少开销而感到惊讶int*。该段大约在时间点17:25开始。 您可以看一下他的示例代码对(godbolt.org)的编译结果 -可以看到,确实,编译器似乎不愿意传递unique_ptr值-实际上,底线是只是一个地址-在寄存器内,仅在直接内存中。 Carruth先生在27:00左右提出的观点之一是,C ++ ABI要求按值传递参数(某些但不是全部;也许-非基本类型?而不是在寄存器中。 我的问题: 这实际上是某些平台上的ABI要求吗?(哪个?)或者在某些情况下可能只是一些悲观? 为什么ABI这样?也就是说,如果结构/类的字段适合寄存器,甚至单个寄存器,为什么我们不能在该寄存器中传递它呢? 近年来,C ++标准委员会是否曾经讨论过这一点? PS-为了不给这个问题留下代码: 普通指针: void bar(int* ptr) noexcept; void baz(int* ptr) noexcept; void foo(int* ptr) noexcept { if (*ptr &gt; 42) { bar(ptr); *ptr = 42; } baz(ptr); } 唯一指针: using std::unique_ptr; void bar(int* ptr) noexcept; void …

4
如何传递std :: unique_ptr?
我正在尝试使用C ++ 11 unique_ptr;我正在替换我的一个项目中的多态原始指针,该项目属于一个类,但是经常通过。 我以前有类似的功能: bool func(BaseClass* ptr, int other_arg) { bool val; // plain ordinary function that does something... return val; } 但是我很快意识到我将无法切换到: bool func(std::unique_ptr&lt;BaseClass&gt; ptr, int other_arg); 因为调用者将不得不处理该函数的指针所有权,所以我不想这么做。那么,什么是解决我的问题的最佳方法? 我虽然将指针作为参考传递,像这样: bool func(const std::unique_ptr&lt;BaseClass&gt;&amp; ptr, int other_arg); 但是我这样做很不自在,首先是因为传递已经输入_ptr为引用的东西似乎不是本能,这将是引用的引用。其次,因为功能签名变得更大。第三,因为在生成的代码中,需要两个连续的指针间接访问才能到达我的变量。
83 c++  c++11  unique-ptr 




6
创建持有已分配数组的unique_ptr的正确方法
创建一个unique_ptr来保存在免费存储中分配的数组的正确方法是什么?Visual Studio 2013默认情况下支持此功能,但是当我在Ubuntu上使用gcc版本4.8.1时,会出现内存泄漏和未定义的行为。 可以使用以下代码重现该问题: #include &lt;memory&gt; #include &lt;string.h&gt; using namespace std; int main() { unique_ptr&lt;unsigned char&gt; testData(new unsigned char[16000]()); memset(testData.get(),0x12,0); return 0; } Valgrind将给出以下输出: ==3894== 1 errors in context 1 of 1: ==3894== Mismatched free() / delete / delete [] ==3894== at 0x4C2BADC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==3894== by 0x400AEF: …
74 c++  linux  gcc  c++11  unique-ptr 

3
将派生类的unique_ptr用作将unique_ptr用作基类的函数的参数
我正在尝试unique_ptr在将aunique_ptr用作基类的函数中使用to派生类。就像是: class Base {}; class Derived : public Base {}; void f(unique_ptr&lt;Base&gt; const &amp;base) {} … unique_ptr&lt;Derived&gt; derived = unique_ptr&lt;Derived&gt;(new Derived); f(derived); 如果我正确理解此答案,则此代码应该可以工作,但是会导致以下编译错误: 错误C2664:'f':无法将参数1从'std :: unique_ptr &lt;_Ty&gt;'转换为'const std :: unique_ptr &lt;_Ty&gt;&' IntelliSense:不存在从“ std :: unique_ptr &lt;派生,std :: default_delete &lt;派生&gt;&gt;”到“ const std :: unique_ptr &lt;基本,std :: default_delete &lt;基本&gt;&gt;”的合适的用户定义转换 如果我更改f为take unique_ptr&lt;Derived&gt; const …

2
我应该分配或重置unique_ptr吗?
在通常情况下,拥有对象的生命周期与其拥有者相关联,我可以使用2种方法之一的唯一指针。。 可以分配: class owner { std::unique_ptr&lt;someObject&gt; owned; public: owner() { owned=std::unique_ptr&lt;someObject&gt;(new someObject()); } }; 可以使用reset方法: class owner { std::unique_ptr&lt;someObject&gt; owned; public: owner() { owned.reset(new someObject()); } }; 为了最佳实践,我是否应该优先选择一种形式? 编辑:对不起人们。我过度简化了这一点。堆分配以初始化方法而不是ctor进行。因此,我不能使用初始化程序列表。

2
为什么shared_ptr仅使用一个时,unique_ptr会使用两个模板参数?
双方unique_ptr并shared_ptr接受定制的析构函数他们所拥有的对象上调用。但在的情况下unique_ptr,析构函数作为一个模板参数传递类,而类型shared_ptr的自定义析构函数将被指定为一个模板参数的构造函数。 template &lt;class T, class D = default_delete&lt;T&gt;&gt; class unique_ptr { unique_ptr(T*, D&amp;); //simplified ... }; 和 template&lt;class T&gt; class shared_ptr { template&lt;typename D&gt; shared_ptr(T*, D); //simplified ... }; 我不明白为什么会有这样的差异。有什么要求?


3
从函数返回唯一的空指针
要从void *CI中的函数获取a ,将执行以下操作(非常基本的示例): void *get_ptr(size_t size) { void *ptr = malloc(size); return ptr; } 使用时如何获得相同的结果std::unique_ptr&lt;&gt;?
11 c++  c  unique-ptr 

3
unique_ptr <0或小于运算符的作用是什么?
我正在处理不是由我编写的代码。我有这句话: // p is type of std::unique_ptr&lt;uint8_t[]&gt; if (p &lt; 0) { /* throw an exception */ } 那么p &lt; 0在这种情况下意味着什么呢? 在文档页面,我相信我的情况是16) y &lt; nullptr,这里0是nullptr。 但是它是做什么的呢?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.