Unique_ptr析构函数表示对象从未被分配过

Unique_ptr destructor saying object has never been allocated

本文关键字:分配 对象 ptr 析构函数 表示 Unique      更新时间:2023-10-16

我有一个拥有Model对象的主进程。这样做的目的是在执行任务和修改相同模型的各种对象之间共享模型。

现在,我为这个对象创建了一个unique_ptr,并将对该unique_ptr的引用传递给其他对象来执行某些任务。

所有任务都正确完成,但是当它试图调用unique_ptr的析构函数时,发生了一些奇怪的事情。它表明:

RAW:内存分配错误:0xd0ebdfb2b8的对象从未分配过

问题:

  1. 为什么发生这个错误?
  2. unique_ptr是解决这个问题的正确方法吗?

谢谢

1。为什么会发生这个错误?

如果没有看到你的代码,就不可能回答为什么会发生这种情况。

2。 unique_ptr是解决这个问题的正确方法吗?

根据Straustrup和Sutter的核心指南

R.30:仅在显式表达生命周期语义时才将智能指针作为参数

原因:如果函数只需要widget本身,接受指向widget的智能指针是错误的。它应该能够接受任何widget对象,而不仅仅是那些生命周期由特定类型的智能指针管理的对象。不操作生命周期的函数应该接受原始指针或引用。

您应该只在函数可能需要更改其所有权时才将std::unique_ptr传递给该函数。否则,应该将原始指针引用传递给unique_ptr正在管理的对象。

我需要看到一个代码示例来给你一个具体的解决方案或反馈。

但是,这一行:

现在,我为这个对象创建了一个unique_ptr,并将对该unique_ptr的引用传递给其他对象来执行某些任务。

对我来说很可疑。将引用传递给unique_ptr(或其他拥有的数据结构)几乎总是不正确的。您应该倾向于对底层对象的简单引用;也就是说,您应该用Model&替换std_unqiue_ptr<Model>&的所有实例。

当我看到它时:

现在,我为这个对象创建了一个unique_ptr,并将对该unique_ptr的引用传递给其他对象来执行某些任务。

我理解像

这样的东西
std::unique_ptr<type> u( new type() );
std::unique_ptr<type> w = u;

但是unique_ptr的原则是只处理一次。这将抛出一个错误,因为unique_ptr包装对象的复制构造函数被禁用。

但是没有例子,很难回答:)

与这里的一些答案相反,通过const引用传递管理实体(shared_ptr, unique_ptr)并没有错。实际上,在某些情况下,通过引用传递可能是unique_ptr的唯一方法,而对于shared_ptr则是首选方法。例子:

void foo(const std::shared_ptr<obj_t>/*&*/ obj) { obj->func(); }

如果没有引用,就会有不必要的引用计数器递增/递减,从而导致性能延迟。不,有人会争辩说没有必要在foo()中使用shared_ptr,我同意,但是我见过的一些开发环境对"代码中没有裸指针"的要求非常严格!说错了可能会让你丢了工作。在这种情况下,通过引用传递是解决方案。