Unique_ptr析构函数表示对象从未被分配过
Unique_ptr destructor saying object has never been allocated
我有一个拥有Model对象的主进程。这样做的目的是在执行任务和修改相同模型的各种对象之间共享模型。
现在,我为这个对象创建了一个unique_ptr,并将对该unique_ptr的引用传递给其他对象来执行某些任务。
所有任务都正确完成,但是当它试图调用unique_ptr的析构函数时,发生了一些奇怪的事情。它表明:
RAW:内存分配错误:0xd0ebdfb2b8的对象从未分配过
问题:
- 为什么发生这个错误? 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,我同意,但是我见过的一些开发环境对"代码中没有裸指针"的要求非常严格!说错了可能会让你丢了工作。在这种情况下,通过引用传递是解决方案。
- 使用操作重载对象重新分配对象
- 静态分配对象的值初始化
- C++ 将抽象类型的动态分配对象传递给函数并存储在向量中
- 堆分配对象中的堆栈对象在 c++ 中在哪里分配?
- 在 c++ 的构造函数中分配对象向量时出错
- 动态分配对象中的字段-动态分配更好还是静态分配更好?C++
- 操作后通过运算符分配对象
- 如何捕获源自静态分配对象的构造函数的异常?
- 在C++中,当重新分配对象时,为什么构造函数在析构函数之前触发?
- 如何使用每个对象的单个构造函数参数动态分配C++对象数组?
- 将动态分配对象传递到 boost::any 构造函数中
- 混合指向已分配对象和作用域对象的指针
- C 删除指向动态分配对象的指针
- 有关动态分配对象的问题
- 类的堆分配对象是否在其作用域之后但在 C++ 中调用其析构函数之前处于活动状态
- C++ 中的黑白堆分配对象和堆栈分配对象的性能差异
- 是隐式创建的默认构造函数,负责分配对象内存
- 如何删除用于动态分配对象的智能指针
- 分配对象数组时如何初始化每个对象
- 用于堆栈分配对象的C++虚拟析构函数内联