【问题标题】:Destructor and python析构函数和python
【发布时间】:2011-08-03 03:46:12
【问题描述】:

我在 c++ 中有一些 Base 类。我使用 boost::python 将它导出到 python 中。但是虚拟析构函数呢?任何基类都应该有虚拟析构函数以避免错误的内存释放,对吧?我忘记了这一点,并在没有析构函数的情况下写了Base。一切正常,但有很多内存泄漏。

现在我添加了:

class Base
{
   public:
      virtual ~Base();
      // Other members...
};

在 python 中导入我的模块后,我得到一个错误:

ImportError: Base.so: 未定义 符号:_ZTI6Base

我做错了什么?而且,据我了解,错误是由于缺少 py-module 的析构函数导出器造成的。

【问题讨论】:

  • @Ockonal: Every Base Class should have virtual destructor 不正确,除非您的基类是 polymorphic
  • @Ockonal:您确定将析构函数导出到导入库吗?你确定你实现了这个功能?
  • @als 听不懂你:(polymorphic 是什么意思?
  • @als 我通过指向Base 的指针使用派生类。那叫polymorphic?
  • @Ockonal:多态基类意味着你的基类应该至少有一个虚拟成员函数。

标签: c++ python boost virtual-destructor


【解决方案1】:

你可以这样做

class Base
{
   public:
      virtual ~Base() {}
      // Other members...
};

确保定义了析构函数

【讨论】:

  • 那么,析构函数是自动导出的?
  • 不会自动导出任何内容。
【解决方案2】:

缺少符号错误可能是由于您未能定义析构函数(您正在声明析构函数,但从您的问题中不清楚您是否是定义它):

class Base
{
   public:
      virtual ~Base() {}
      // Other members...
};

(注意添加的花括号)

关于是否每个“基类都应具有虚拟析构函数以避免错误的内存释放”的问题,请查看常见问题解答:http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.7

【讨论】:

  • 析构函数后的;是假的。
猜你喜欢
  • 2013-07-07
  • 2011-04-03
  • 2010-12-16
  • 2021-11-04
  • 2011-12-27
  • 1970-01-01
  • 2013-03-21
  • 2013-03-07
相关资源
最近更新 更多