【问题标题】:C++ unique_ptr not calling the destructorC++ unique_ptr 不调用析构函数
【发布时间】:2023-03-31 15:10:01
【问题描述】:

我有一个 vectorunique_ptrs 指向一个名为 state 的类。当我用向量调用pop_back() 时,唯一指针会从内存中删除(我认为),但它指向的状态对象永远不会被删除。在删除它指向的对象时,无论是那个还是唯一指针都不会调用析构函数?我所知道的是,当我的唯一指针从向量中删除时,我的析构函数不会被调用。

这是向量:

std::vector< std::unique_ptr<State> > mStates;

我试过了:

mStates.pop_back();

这删除了唯一指针,我认为唯一指针会为我删除状态并调用状态的析构函数,但这并没有发生。顺便说一句,我使用以下方法添加元素:

 mStates.push_back();

【问题讨论】:

  • 请展示一些代码来证明您的问题。您肯定在滥用某些东西,但如果没有看到代码,我们无法猜测是什么。见SSCCE
  • 无法复制:ideone.com/uMRUR2
  • @SusanYanders 啊,这可能是原因。你的 State 基类必须有一个虚拟析构函数(那么你的派生类也会自动获得一个虚拟析构函数,即使你没有手动指定它)否则你不能删除派生的对象通过基类指针类。
  • 任何体面的编译器都应该警告带有虚拟方法但没有虚拟析构函数的类。

标签: c++ pointers


【解决方案1】:

我修好了。我的问题是我需要一个虚拟析构函数。我什至没有考虑可能存在虚拟析构函数。现在可以了。

【讨论】:

  • 你应该调查你的编译器选项,g++ 肯定会警告你这样的事情。
  • @PaulGriffiths 我开始认为 VS2012 在某些时候警告过我。我只是懒得看警告
  • @SusanYanders,养成摆脱所有警告的习惯,即使是关于您出于某种原因正在做的事情的警告(即使您必须禁用方法或文件的特定警告)。它将跟踪这样的错误,这可能会占用大量时间并且会导致无休止的挫败感。更好的是运行类似 lint 的东西,它会发现更细微的错误。此外,如果您不了解虚拟析构函数,您应该阅读 Scott Mayer 的 Effective C++,它有很多您应该了解的知识。
  • 刚刚在 GCC 4.9.2 (2014-12-24) 中遇到了这个问题 - 没有关于具有非纯虚拟方法的基类中缺少虚拟析构函数的警告。我假设它是隐式的,但不,你必须明确声明一个虚拟析构函数!
  • 密切相关:std::unique_ptr::release() 不会删除,使用 std::unique_ptr::reset() 代替。
猜你喜欢
  • 2014-10-25
  • 1970-01-01
  • 2013-03-07
  • 2019-01-09
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 2011-04-04
相关资源
最近更新 更多