C 라이브러리를 Perl로 래핑하려고합니다. 내가 XS
로 tinkered했지만 나는 단순히 Inline::C
로 시작한다고 생각 실패했습니다. 제 질문은 마멸에 관한 것입니다. 나는 가능한 한 가장 좋은 것으로 perlguts를 읽었지 만 여전히 혼란 스럽다. SV *에 sv_2mortal
으로 전화해야합니다. SV *가 스택에 푸시되지 않으면 반환됩니다.업데이트 : Perl에서 변수를 "mortalize"할 때 Inline :: C
(추신 : 저는 실제로 나를 괴롭히는 C의 기능적 지식보다 작습니다. 나는 C가 나를 돕는 것을 알고 있지만 펄은 몰라요.)
아래 샘플을 제공합니다. FLIGetLibVersion
함수는 단순히 라이브러리 버전의 len
문자를 char * ver
에 넣습니다. 제 질문은 version_return
형태의 C 코드 누출 메모리입니까?
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;
}
편집 :이 나 자신에 대답하기위한 시도에서
, 나는 선을 변경 시도
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.
나는이 경우에 필사적으로 말할 필요가 없다는 것을 상상합니까? 나는 그 오류가 내가 이미 수집을 위해 줄을 서고있는 어떤 것을 수집을 위해 표시했다는 것을 말하고있는 것 같다. 누군가 그 경고가 의미하는 바를 확인할 수 있습니까?
필자는 Perl을 C와 통합하는 방법이 훨씬 적다는 것을 알았지 만 코드가 평범한 오래된 C이고'libfli.h '에'Inline_Stack_Vars;'라는 줄이 없다면, 'Inline_Stack_Reset;','Inline_Stack_Done;'함수는 전혀 없습니다. – pmg
@pmg Perl과 C 사이에는 많은 마법이 있습니다. 이러한 함수는 컴파일 전에 자동으로 읽히는 헤더에 정의됩니다. –
이미 [SWIG] (http://www.swig.org/)를 사용해 보셨습니까? – hlynur