SWIG - утечка памяти при переносе std :: пары строк - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь обернуть std :: map с помощью SWIG в python, и он работает хорошо, за исключением того, что он теряет память (мой код ниже).

Очевидно, SWIG автоматически освобождает память возвращаемого объекта (Tuple), но не освобождает выделенную внутри String.Я прочитал, что могу использовать явное освобождение, используя %typemap(newfree), но не знаю, как реализовать.

%typemap(out) std::pair<std::string, double> {
    $result = PyTuple_Pack(2, PyUnicode_FromString($1.first.c_str()), 
                              PyFloat_FromDouble($1.second));
};

%typemap(newfree) std::pair<std::string, double> {
     // What to do here?
     // delete[] $1.first.c_str() clearly not the way to go...
}

1 Ответ

0 голосов
/ 18 февраля 2019

SWIG имеет предопределенные карты типов для pair и string, поэтому вам не нужно писать их самостоятельно:

test.i

%module test

// Add appropriate includes to wrapper
%{
#include <utility>
#include <string>
%}

// Use SWIG's pre-defined templates for pair and string
%include <std_pair.i>
%include <std_string.i>

// Instantiate code for your specific template.
%template(sdPair) std::pair<std::string,double>;

// Declare and wrap a function for demonstration.
%inline %{
    std::pair<std::string,double> get()
    {
        return std::pair<std::string,double>("abcdefg",1.5);
    }
%}

Демо:

>>> import test
>>> p = test.sdPair('abc',3.5)
>>> p.first
'abc'
>>> p.second
3.5
>>> test.get()
('abcdefg', 1.5)
...