我有一个拥有Model对象的主进程。这样做的目的是在执行任务和修改相同模型的各种对象之间共享模型。
现在,我为此对象创建了一个unique_ptr,并将对unique_ptr的引用传递给其他对象以执行某些任务。
任务都正确完成,但是当它尝试在unique_ptr上调用析构函数时会发生奇怪的事情。它显示:
RAW:内存分配错误:0xd0ebdfb2b8上的对象从未被分配
问题:
由于
答案 0 :(得分:1)
<强> 1。 为什么会发生此错误?
如果没有看到你的代码,就无法回答为什么会发生这种情况。
<强> 2。 unique_ptr是解决此问题的正确方法吗?
根据Straustrup和Sutter的Core Guidlines
R.30:将智能指针作为参数仅用于显式表达生命周期语义
原因:如果函数只需要
widget
本身,则接受指向widget
的智能指针是错误的。 它应该能够接受任何widget
对象,而不仅仅是其生命周期由特定类型的智能指针管理的对象。 不操作生命周期的函数应该采用原始指针或引用。
如果该函数可能需要更改其所有权,则应该只将std::unique_ptr
传递给函数。否则,您应该将原始指针或引用传递给unique_ptr
正在管理的对象。
答案 1 :(得分:0)
我需要看一个代码示例来为您提供具体的解决方案或反馈。
然而,这一行:
现在,我为此对象创建了一个unique_ptr,并将对unique_ptr的引用传递给其他对象以执行某些任务。
对我很怀疑。将引用传递给您的unique_ptr
(或其他拥有的数据结构)几乎总是不正确的。您应该支持对底层对象的简单引用;也就是说,您应该将std_unqiue_ptr<Model>&
的所有实例替换为Model&
。
答案 2 :(得分:-1)
当我读到它时:
现在,我为此对象创建了一个unique_ptr,并将对unique_ptr的引用传递给其他对象以执行某些任务。
我理解像
这样的东西std::unique_ptr<type> u( new type() );
std::unique_ptr<type> w = u;
但unique_ptr
的原则只能被处理一次。这会引发错误,因为unique_ptr
- 包装对象的copy-contructor被禁用。
但是没有例子,很难回答:)
答案 3 :(得分:-2)
与此处的一些答案相反,通过const引用传递管理实体(shared_ptr,unique_ptr)没有任何问题。事实上,通过引用传递可能是在某些情况下使用unique_ptr并且首选使用shared_ptr的唯一方法。例如:
void foo(const std::shared_ptr<obj_t>/*&*/ obj) { obj->func(); }
如果没有引用,将会有一个不必要的引用计数器递增/递减,从而导致性能延迟。不,有人会认为没有必要在foo()中使用shared_ptr开始,我同意,但我所看到的一些开发环境对于我们的裸体指针是非常严格的。代码!&#39;,并且认为他们错了可能会让你失去工作。在这种情况下,通过引用传递是解决方案。