Деструктор C ++ не вызывается в файле интерфейса Swig - PullRequest
0 голосов
/ 02 октября 2018

Я создаю интерфейс между C ++ и кодом Python.

Я создаю модуль с именем composition_api в файле интерфейса Swig.У него есть методы, которые я импортирую в модуль Python, как показано ниже.

/// SWIG Interface File.
%module composition_api
%{
    #include <include/mcm/compiler/compilation_unit.hpp>


    mv::CompilationUnit* getCompilationUnit(bool disableHardware)
    {
        auto unit = new mv::CompilationUnit("pySwigCU");
             return unit;
    }
}

Я импортирую это как библиотеку в скрипт Python.

Скрипт Python

import composition_api as ca
compUnit = ca.getCompilationUnit(not enableHardware)

Когда скрипт Python завершен, деструктор CompilationUnit невызывается в исходном коде C ++.Должен ли я создать метод в файле интерфейса, который вызывает delete unit?

1 Ответ

0 голосов
/ 02 октября 2018

Аналог C ++ для compUnit является указателем.Когда compUnit является сборщиком мусора Python, он просто собирает указатель мусора.Он не вызывает автоматически delete для указателя.

У вас есть пара вариантов, о которых я могу подумать.

  1. Вернуть объект в Python, который является оберткой дляуказательКогда объект получает мусор, вызывается его деструктор.Добавьте необходимый код для удаления объекта C ++ в деструкторе оболочки.

  2. Добавьте явную функцию в файл интерфейса swig для удаления объекта.Обязательно вызовите функцию в Python до окончания области действия объекта Python.

...