Tag: unique ptr

不好的做法,像所有权语义返回unique_ptr的原始指针?

我写了一个静态工厂方法,返回从另一个数据对象填充新的Foobar对象。 我最近一直痴迷于所有权语义,并想知道是否通过让这个工厂方法返回一个unique_ptr传递正确的消息。 class Foobar { public: static unique_ptr<Foobar> factory(DataObject data); } 我的意图是告诉客户端代码,他们拥有指针。 没有一个聪明的指针,我只会返回Foobar* 。 但是,我想强制删除这个内存以避免潜在的错误,所以unique_ptr看起来是一个合适的解决scheme。 如果客户端想要延长指针的生命周期,他们只要调用.release()一旦得到unique_ptr 。 Foobar* myFoo = Foobar::factory(data).release(); 我的问题分两部分: 这种方法是否传达了正确的所有权语义? 这是一个“坏习惯”返回unique_ptr而不是一个原始指针?

boost :: scoped_ptr <T>和std :: unique_ptr <T>之间的区别

boost::scoped_ptr<T>和std::unique_ptr<T>之间的唯一区别是std::unique_ptr<T>具有移动语义,而boost::scoped_ptr<T>只是一个get / reset智能指针?

如何通过std :: unique_ptr?

我正在尝试使用C ++ 11 unique_ptr ; 我正在replace一个属于一个类的项目中的一个多态的原始指针,但是经常传递。 我曾经有这样的function: bool func(BaseClass* ptr, int other_arg) { bool val; // plain ordinary function that does something… return val; } 但我很快意识到,我不能切换到: bool func(std::unique_ptr<BaseClass> ptr, int other_arg); 因为调用者将不得不处理函数的指针所有权,我不想要的东西。 那么,我的问题最好的解决scheme是什么? 我虽然通过指针作为参考,如下所示: bool func(const std::unique_ptr<BaseClass>& ptr, int other_arg); 但是我觉得这样做很不舒服,首先是因为传递一些已经作为参考的东西似乎是非本能的,这可能是一个参考的参考。 其次,因为函数签名变得更大。 第三,因为在生成的代码中,需要两个连续的指针间接来达到我的variables。

unique_ptr相当于boost吗?

在boost库中有一些C ++ 1x的std :: unique_ptr的等价类吗? 我正在寻找的行为是能够有一个exception安全的工厂function,像这样… std::unique_ptr<Base> create_base() { return std::unique_ptr<Base>(new Derived); } void some_other_function() { std::unique_ptr<Base> b = create_base(); // Do some stuff with b that may or may not throw an exception… // Now b is destructed automagically. } 编辑:现在,我正在使用这个黑客,这似乎是最好的,我可以在这一点上… Base* create_base() { return new Derived; } void some_other_function() { boost::scoped_ptr<Base> b = […]

我如何使用unique_ptr pimpl?

这里是我尝试使用unique_ptr for pimpl时看到的简化。 我select了unique_ptr,因为我真的希望类拥有指针 – 我希望pimpl指针和类的生命期是相同的。 无论如何,这是标题: #ifndef HELP #define HELP 1 #include <memory> class Help { public: Help(int ii); ~Help() = default; private: class Impl; std::unique_ptr<Impl> _M_impl; }; #endif // HELP 这里是来源: #include "Help.h" class Help::Impl { public: Impl(int ii) : _M_i{ii} { } private: int _M_i; }; Help::Help(int ii) : _M_impl{new Help::Impl{ii}} { […]

shared_ptr <>是为了weak_ptr <>作为unique_ptr <>是…什么?

在C ++ 11中,您可以使用shared_ptr<>与对象或variables以及weak_ptr<>build立所有权关系,以非所有方式安全地引用该对象。 您还可以使用unique_ptr<>与对象或variablesbuild立所有权关系。 但是,如果其他非拥有对象也想引用该对象呢? weak_ptr<>在这种情况下没有帮助。 原始指针是有帮助的,但带来了各种缺点(例如,它们可以自动初始化为nullptr,但是这是通过与std::*_ptr<>types不一致的技术来实现的)。 对于通过unique_ptr<>拥有的对象的非拥有引用,等价于weak_ptr<>是什么? 这是一个澄清的例子,类似于我正在做的游戏中的某些东西。 class World { public: Trebuchet* trebuchet() const { return m_trebuchet.get(); } private: std::unique_ptr< Trebuchet > m_trebuchet; }; class Victim { public: Victim( Trebuchet* theTrebuchet ) : m_trebuchet( theTrebuchet ) {} ~Victim() { delete m_trebuchet; // Duh. Oops. Dumb error. Nice if the compiler helped prevent this. […]

为什么unique_ptr只有在shared_ptr只有一个参数的时候才需要两个模板参数呢?

unique_ptr和shared_ptr接受一个自定义析构函数来调用它们自己拥有的对象。 但是在unique_ptr的情况下,析构函数作为类的模板parameter passing,而shared_ptr的自定义析构函数的types被指定为构造函数的模板参数。 template <class T, class D = default_delete<T>> class unique_ptr { unique_ptr(T*, D&); //simplified … }; 和 template<class T> class shared_ptr { template<typename D> shared_ptr(T*, D); //simplified … }; 我看不出为什么这样的区别。 什么要求?

那么,std :: unique_ptr的定制删除器是如何工作的呢?

根据N3290, std::unique_ptr在其构造函数中接受一个deleter参数。 但是,我不能在Windows中使用Visual C ++ 10.0或MinGW g ++ 4.4.1,也不能使用Ubuntu中的g ++ 4.6.1。 因此,我担心自己对这个问题的理解是不完整或错误的,我看不到一个明显被忽略的删除论点,那么任何人都可以提供一个工作的例子吗? 最好我也想看看unique_ptr<Base> p = unique_ptr<Derived>( new Derived ) 。 可能用标准中的一些措辞来备份这个例子,也就是说,不pipe你使用的是什么编译器,它实际上是做它应该做的事情?

是否unique_ptr保证移动后存储nullptr?

是否unique_ptr保证移动后存储nullptr ? std::unique_ptr<int> p1{new int{23}}; std::unique_ptr<int> p2{std::move(p1)}; assert(!p1); // is this always true?

auto_ptr是否被弃用?

auto_ptr会在传入的C ++标准中被弃用吗? unique_ptr应该用于所有权转移,而不是shared_ptr? 如果unique_ptr不在标准中,那么我是否需要使用shared_ptr?