Tag: 智能指针

为unique_ptrdynamic投射

正如Boost中的情况一样,C ++ 11提供了一些用于强制shared_ptr函数: std::static_pointer_cast std::dynamic_pointer_cast std::const_pointer_cast 不过,我想知道为什么没有unique_ptr等价函数。 考虑以下简单的例子: class A { virtual ~A(); … } class B : public A { … } unique_ptr<A> pA(new B(…)); unique_ptr<A> qA = std::move(pA); // This is legal since there is no casting unique_ptr<B> pB = std::move(pA); // This is not legal // I would like to do something […]

不好的做法,像所有权语义返回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而不是一个原始指针?

C ++ 11:用std :: shared_ptr()replace所有非拥有的原始指针?

随着std::unique_ptr的出现,瑕疵的std::auto_ptr最终可以被搁置。 所以最近几天,我一直在改变我的代码使用智能指针,并消除从我的代码的所有delete 。 虽然valgrind说我的代码是内存清理的,但是智能指针的语义丰富性会使代码变得更清晰和更容易理解。 在大多数代码中,翻译很简单:使用std::unique_ptr代替拥有的对象持有的原始指针,抛出delete ,然后小心地get() , reset()和move()调用需要与其他代码进行良好的交互。 我现在正在将非拥有的原始指针翻译成智能指针。 由于我对我的对象的生命周期(我确保我的模块只依赖于一个方向)的生命周期小心,valgrind告诉我,我没有任何未初始化的读取,悬挂指针或泄漏。 所以,从技术上讲,我现在可以把那些非拥有的原始指针单独留下。 但是,一个select是将那些非拥有的原始指针改为std::shared_ptr因为我知道它们是非循环的。 或者,将它们作为原始指针会更好吗? 我需要智能指针的资深用户提供一些build议,关于用什么规则来决定是否保留非拥有的原始指针 ,或者将它们转换成std::shared_ptr ,请记住,testing和valgrind我的代码。 编辑:我可能会误解std::shared_ptr的使用 – 它们可以与std::unique_ptr一起使用,或者,如果我使用std::shared_ptr ,所有的句柄也应该是std::shared_ptr ?

std :: make_unique和std :: unique_ptr之间的区别

std::make_unique是否有像std::makes_shared一样的效率好处? 与手动构buildstd::unique_ptr相比: std::make_unique<int>(1); // vs std::unique_ptr<int>(new int(1));

如何使用智能指针协变返回types?

我有这样的代码: class RetInterface {…} class Ret1: public RetInterface {…} class AInterface { public: virtual boost::shared_ptr<RetInterface> get_r() const = 0; … }; class A1: public AInterface { public: boost::shared_ptr<Ret1> get_r() const {…} … }; 这段代码不能编译。 在视觉工作室,它引发了 C2555:重写虚函数返回types不同,并且不是协变的 如果我不使用boost::shared_ptr但返回原始指针,代码编译(我明白这是由于在C ++ 协变返回types )。 我可以看到问题是因为Ret1 boost::shared_ptr不是从RetInterface boost::shared_ptr RetInterface 。 但是我想返回Ret1 boost::shared_ptr以供其他类使用,否则我必须在返回后Ret1返回值。 难道我做错了什么? 如果没有,为什么这样的语言 – 在这种情况下,应该可以扩展处理智能指针之间的转换? 有没有一个理想的解决方法?

为什么unique_ptr将deleter作为types参数,而shared_ptr则没有?

std::unique_ptr模板有两个参数:指针的types和删除器的types。 这第二个参数有一个默认值,所以你通常只是写一些像std::unique_ptr<int> 。 std::shared_ptr模板只有一个参数:指针的types。 但是,即使删除types不在类模板中,也可以使用此自定义删除程序。 通常的实现使用types擦除技术来做到这一点。 是否有同样的想法没有用于std::unique_ptr ?

何时使用shared_ptr以及何时使用原始指针?

class B; class A { public: A () : m_b(new B()) { } shared_ptr<B> GimmeB () { return m_b; } private: shared_ptr<B> m_b; }; 比方说,B是一个在语义上不应该存在于A的生命周期之外的类,也就是说,B本身是完全没有意义的。 GimmeB应该返回一个shared_ptr<B>或B*吗? 一般来说,完全避免使用C ++代码中的原始指针代替智能指针是一种很好的做法吗? 我认为shared_ptr应该只在明确的所有权转移或共享时才使用,除了函数分配一些内存,填充一些数据并返回它的情况之外,我认为这是很less见的,主叫方和被叫方之间的理解是,前者现在对这些数据负责。

如何通过引用或值来返回智能指针(shared_ptr)?

比方说,我有一个类返回一个shared_ptr的方法。 通过参考或价值回报可能有哪些好处和弊端? 两个可能的线索: 早期的物体破坏。 如果我通过(const)引用返回shared_ptr ,那么引用计数器不会增加,所以当我们在另一个上下文中(例如另一个线程)超出了范围时,我就有被删除的风险。 它是否正确? 如果环境是单线程的,那么这种情况是否也会发生呢? 成本。 传递价值当然不是免费的。 是否值得尽量避免? 谢谢大家。

为什么shared_ptr <void>是合法的,而unique_ptr <void>是不合格的?

这个问题真的很符合标题:我很想知道这种差异的技术原因是什么,但也有理由吗? std::shared_ptr<void> sharedToVoid; // legal; std::unique_ptr<void> uniqueToVoid; // ill-formed;

为什么auto_ptr被弃用?

我听说在C ++ 11中不推荐使用auto_ptr 。 这是什么原因? 另外我想知道auto_ptr和shared_ptr之间的区别。