SWIG - Сборка мусора с использованием% newobject - PullRequest
4 голосов
/ 02 января 2011

В моем коде C у меня есть следующая структура:

typedef struct my_structure{
    char* str1;
    char* str2;
}MyStruct;

И функция, которая возвращает указатель MyStruct:

MyStruct* foo();

Внутри foo я выделил память для MyStruct, str1 и str2 следующим образом:

MyStruct* obj = malloc(sizeof(MyStruct));

obj.str1 = malloc(256);
obj.str2 = malloc(256);

Я хочу вызвать foo из python, java, C # и PHP и не хочу, чтобы в этом процессе возникала утечка памяти.

Я не уверен, что пишу:

%newobject foo;
MyStruct* foo();

гарантирует, что сборщик мусора освободит память как для структуры, так и для строк внутри нее.

Я не хотел обязывать вызывающую сторону явно освобождать память для str1 и str2, так как я искал автоматический способ освобождения памяти. Это возможно?

Нужно ли в этом случае использовать newfree typemap?

Я был бы очень признателен, если бы вы предоставили мне пример, показывающий лучший способ сделать это.

Спасибо!

1 Ответ

4 голосов
/ 02 января 2011

typemap(newfree) освобождает память, используемую возвращенным %newobject немедленно, например, когда возвращаемое значение char * преобразуется в строку Python и выделенный объект больше не нужен.Я думаю, что вы хотите %extend оболочку класса, которую SWIG генерирует вокруг вашей структуры C для предоставления деструктора:

%newobject foo;

%extend MyStruct {
    ~MyStruct() {
       free($self->str1);
       free($self->str2);
    }
}

Пожалуйста, прокомментируйте, если это решит вашу проблему.Это основано на моих собственных экспериментах с тем, что я мог найти в документации SWIG, и правильно работало в простой сгенерированной оболочке.

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