2011-03-02 3 views
5

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. 

나는이 경우에 필사적으로 말할 필요가 없다는 것을 상상합니까? 나는 그 오류가 내가 이미 수집을 위해 줄을 서고있는 어떤 것을 수집을 위해 표시했다는 것을 말하고있는 것 같다. 누군가 그 경고가 의미하는 바를 확인할 수 있습니까?

+0

필자는 Perl을 C와 통합하는 방법이 훨씬 적다는 것을 알았지 만 코드가 평범한 오래된 C이고'libfli.h '에'Inline_Stack_Vars;'라는 줄이 없다면, 'Inline_Stack_Reset;','Inline_Stack_Done;'함수는 전혀 없습니다. – pmg

+2

@pmg Perl과 C 사이에는 많은 마법이 있습니다. 이러한 함수는 컴파일 전에 자동으로 읽히는 헤더에 정의됩니다. –

+0

이미 [SWIG] (http://www.swig.org/)를 사용해 보셨습니까? – hlynur

답변

1

몇 년 동안 Set :: Object를 유지 관리 해왔고이 질문도있었습니다. 아마도 코드의 소스를보고 물건이 절멸해야하는지 확인하는 것이 가장 좋습니다 (github.com/samv/Set-Object). 나는 Set :: Object가 많은 변화 직후에 있음을 안다. 나는 생각한다. 당신이 SV를 리턴 스택에 밀어 넣을 때마다 생각한다. 인라인이 모든 것을 어떻게 바꾸는 지 잘 모릅니다.

관련 문제