Я пытаюсь обернуть библиотеку C в Perl. Я возился с XS
, но, потерпев неудачу, подумал, что начинать нужно просто с Inline::C
. Мой вопрос о смертности. Я читал perlguts так хорошо, как только мог, но все еще в замешательстве. Нужно ли мне вызывать sv_2mortal
на SV *, который должен быть возвращен, если я не помещаю его в стек?
(PS Я действительно работаю над слабым знанием C, которое мне больно. У меня есть друг, который знает, что C помогает мне, но он не знает Perl).
Я предоставляю образец ниже. Функция FLIGetLibVersion
просто помещает len
символов версии библиотеки на символ * ver
. У меня вопрос, будет ли version_return
форма моей памяти кода С утечки?
N.B. любые другие комментарии к этому коду приветствуются.
#!/usr/bin/perl
use strict;
use warnings;
use 5.10.1;
use Inline (
C => 'DATA',
LIBS => '-lm -lfli',
FORCE_BUILD => 1,
);
say version_stack();
say version_return();
__DATA__
__C__
#include <stdio.h>
#include "libfli.h"
void version_stack() {
Inline_Stack_Vars;
Inline_Stack_Reset;
size_t len = 50;
char ver[len];
FLIGetLibVersion(ver, len);
Inline_Stack_Push(sv_2mortal(newSVpv(ver,strlen(ver))));
Inline_Stack_Done;
}
SV* version_return() {
size_t len = 50;
char ver[len];
FLIGetLibVersion(ver, len);
SV* ret = newSVpv(ver, strlen(ver));
return ret;
}
Edit:
Пытаясь ответить на этот вопрос самостоятельно, я попытался изменить строку на
SV* ret = sv_2mortal(newSVpv(ver, strlen(ver)));
и теперь, когда я запускаю скрипт, я получаю тот же вывод, что и раньше, плюс дополнительное предупреждение. Вот вывод:
Software Development Library for Linux 1.99
Software Development Library for Linux 1.99
Attempt to free unreferenced scalar: SV 0x2308aa8, Perl interpreter: 0x22cb010.
Я полагаю, это означает, что мне не нужно смертельно в этом случае? Я подозреваю, что ошибка говорит о том, что я пометил для коллекции то, что уже было в очереди на сбор. Может ли кто-нибудь подтвердить для меня, что это означает то предупреждение?