Разрушитель и питон - PullRequest
       24

Разрушитель и питон

1 голос
/ 11 апреля 2011

У меня есть класс Base в c ++.Я экспортирую его в python, используя boost :: python.Но как насчет виртуального деструктора?Любой базовый класс должен иметь виртуальный деструктор, чтобы избежать неправильного освобождения памяти, верно?Я забыл об этом и написал Base без деструктора.Все работает, но с большим количеством утечек памяти.

Теперь я добавил:

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

И после импорта моего модуля в python я получаю ошибку:

ImportError: Base.so: неопределенный символ: _ZTI6Base

Что я делаю не так?И, как я понимаю, ошибка возникает из-за отсутствия экспортера деструктора для py-модуля.

Ответы [ 2 ]

2 голосов
/ 11 апреля 2011

Ошибка отсутствующего символа, вероятно, вызвана тем, что вы не смогли определить деструктор (вы объявляете деструктор, но из вашего вопроса неясно, являетесь ли вы определение это):

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

(обратите внимание на добавленные фигурные скобки)

Что касается вашего вопроса о том, должен ли каждый «базовый класс иметь виртуальный деструктор, чтобы избежать неправильного освобождения памяти», пожалуйста, ознакомьтесь с FAQ: http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.7

0 голосов
/ 11 апреля 2011

Вы можете просто сделать

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

, чтобы убедиться, что деструктор определен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...