Questions tagged «unique-ptr»

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

6
如何将unique_ptr参数传递给构造函数或函数?
我是C ++ 11中移动语义的新手,而且我不太清楚如何处理unique_ptr构造函数或函数中的参数。考虑此类本身的引用: #include <memory> class Base { public: typedef unique_ptr<Base> UPtr; Base(){} Base(Base::UPtr n):next(std::move(n)){} virtual ~Base(){} void setNext(Base::UPtr n) { next = std::move(n); } protected : Base::UPtr next; }; 这是我应该编写带有unique_ptr参数的函数的方式吗? 我需要std::move在调用代码中使用吗? Base::UPtr b1; Base::UPtr b2(new Base()); b1->setNext(b2); //should I write b1->setNext(std::move(b2)); instead?

5
从函数返回unique_ptr
unique_ptr<T>不允许复制构造,而是支持移动语义。但是,我可以unique_ptr<T>从函数返回a 并将返回的值分配给变量。 #include <iostream> #include <memory> using namespace std; unique_ptr<int> foo() { unique_ptr<int> p( new int(10) ); return p; // 1 //return move( p ); // 2 } int main() { unique_ptr<int> p = foo(); cout << *p << endl; return 0; } 上面的代码按预期进行编译和工作。那么,该行如何1不调用复制构造函数并导致编译器错误呢?如果我不得不使用line,2那将会很有意义(使用line 2也可以,但是我们不需要这样做)。 我知道C ++ 0x允许发生此异常,unique_ptr因为返回值是一个临时对象,一旦函数退出,该对象将被销毁,从而保证了返回指针的唯一性。我很好奇这是如何实现的,它是在编译器中进行特殊处理还是在该语言规范中使用了其他条款?
367 c++  c++11  unique-ptr 

8
是否需要std :: unique_ptr <T>知道T的完整定义?
我在标头中有一些代码,如下所示: #include &lt;memory&gt; class Thing; class MyClass { std::unique_ptr&lt; Thing &gt; my_thing; }; 如果我在不包含Thing类型定义的cpp中包含此标头,则无法在VS2010-SP1下编译: 1&gt; C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ include \ memory(2067):错误C2027:使用未定义类型'Thing' 替换std::unique_ptr为std::shared_ptr并编译。 因此,我猜测这是当前VS2010 std::unique_ptr的实现,需要完整的定义,并且完全依赖于实现。 还是?标准要求中是否有某些内容使得的实现无法std::unique_ptr仅与前向声明一起使用?感觉很奇怪,因为它只应持有一个指向的指针Thing,不是吗?


2
为什么不能将unique_ptr推回向量中?
该程序有什么问题? #include &lt;memory&gt; #include &lt;vector&gt; int main() { std::vector&lt;std::unique_ptr&lt;int&gt;&gt; vec; int x(1); std::unique_ptr&lt;int&gt; ptr2x(&amp;x); vec.push_back(ptr2x); //This tiny command has a vicious error. return 0; } 错误: In file included from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/mingw32/bits/c++allocator.h:34:0, from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/allocator.h:48, from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/memory:64, from main.cpp:6: c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/unique_ptr.h: In member function 'void __gnu_cxx::new_allocator&lt;_Tp&gt;::construct(_Tp*, const _Tp&amp;) [with _Tp = std::unique_ptr&lt;int&gt;, _Tp* …

6
make_unique和完美的转发
为什么std::make_unique标准C ++ 11库中没有功能模板?我发现 std::unique_ptr&lt;SomeUserDefinedType&gt; p(new SomeUserDefinedType(1, 2, 3)); 有点冗长。以下内容会更好吗? auto p = std::make_unique&lt;SomeUserDefinedType&gt;(1, 2, 3); 这new很好地隐藏了,只提及了一次类型。 无论如何,这是我尝试实现的make_unique: template&lt;typename T, typename... Args&gt; std::unique_ptr&lt;T&gt; make_unique(Args&amp;&amp;... args) { return std::unique_ptr&lt;T&gt;(new T(std::forward&lt;Args&gt;(args)...)); } 我花了很std::forward长时间才可以编译这些东西,但是我不确定它是否正确。是吗?到底是什么std::forward&lt;Args&gt;(args)...意思?编译器如何处理?

6
类型不完整的std :: unique_ptr无法编译
我在使用pimpl惯用语std::unique_ptr: class window { window(const rectangle&amp; rect); private: class window_impl; // defined elsewhere std::unique_ptr&lt;window_impl&gt; impl_; // won't compile }; 但是,我在第304行中遇到了有关使用不完整类型的编译错误&lt;memory&gt;: 无效的将' sizeof'应用于不完整的类型' uixx::window::window_impl' 据我所知,std::unique_ptr应该可以使用不完整的类型。这是libc ++中的错误,还是我在这里做错了?

4
std :: auto_ptr到std :: unique_ptr
随着新标准的到来(以及某些编译器中已有的部件),新类型std::unique_ptr应被替换为std::auto_ptr。 它们的用法是否完全重叠(因此我可以在我的代码上进行全局查找/替换(不是我可以这样做,但是如果可以的话))还是应该注意阅读文档后看不到的一些区别? 另外,如果它是直接替代品,为什么给它起一个新的名字而不是仅仅改善它std::auto_ptr?

2
为班级成员使用智能指针
我在理解智能指针在C ++ 11中作为类成员的用法时遇到了麻烦。我已经阅读了很多关于智能指针,我想我不知道如何unique_ptr和shared_ptr/ weak_ptr做工一般。我不明白的是真正的用法。似乎每个人都建议将其unique_ptr作为几乎所有时间都使用的方式。但是我将如何实现这样的事情: class Device { }; class Settings { Device *device; public: Settings(Device *device) { this-&gt;device = device; } Device *getDevice() { return device; } }; int main() { Device *device = new Device(); Settings settings(device); // ... Device *myDevice = settings.getDevice(); // do something with myDevice... } …

6
如何将自定义删除器与std :: unique_ptr成员一起使用?
我有一个具有unique_ptr成员的课程。 class Foo { private: std::unique_ptr&lt;Bar&gt; bar; ... }; Bar是具有create()函数和destroy()函数的第三方类。 如果我想std::unique_ptr在独立功能中使用它,我可以这样做: void foo() { std::unique_ptr&lt;Bar, void(*)(Bar*)&gt; bar(create(), [](Bar* b){ destroy(b); }); ... } 有什么办法可以std::unique_ptr作为班级成员吗?



7
如何将std :: unique_ptr传递给函数
如何将a传递std::unique_ptr给函数?可以说我有以下课程: class A { public: A(int val) { _val = val; } int GetVal() { return _val; } private: int _val; }; 以下内容无法编译: void MyFunc(unique_ptr&lt;A&gt; arg) { cout &lt;&lt; arg-&gt;GetVal() &lt;&lt; endl; } int main(int argc, char* argv[]) { unique_ptr&lt;A&gt; ptr = unique_ptr&lt;A&gt;(new A(1234)); MyFunc(ptr); return 0; } 为什么不能将a传递std::unique_ptr给函数?当然这是构建的主要目的吗?还是C ++委员会打算让我退回到原始C风格的指针并像这样传递它: …
101 c++  c++11  unique-ptr 



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.