更新:何时“更新”;“致死”;Perl内联::C中的变量
我试图将C库包装成Perl。我已经修补了更新:何时“更新”;“致死”;Perl内联::C中的变量,c,perl,memory-leaks,inline,C,Perl,Memory Leaks,Inline,我试图将C库包装成Perl。我已经修补了XS,但由于没有成功,我想我应该从Inline::C开始。我的问题是关于凡人化。我一直在尽我所能地阅读perlguts,但仍然感到困惑。我是否需要调用sv*上的sv2mortal,如果我没有将其推到堆栈上,该sv*将被返回 (顺便说一句,我真的是在研究一个不太实用的C语言知识,这让我很痛苦。我有一个认识C语言的朋友在帮助我,但他一点Perl都不懂) 我在下面提供一个样本。函数FLIGetLibVersion只是将库版本的len字符放到char*ver上。我
XS
,但由于没有成功,我想我应该从Inline::C
开始。我的问题是关于凡人化。我一直在尽我所能地阅读perlguts,但仍然感到困惑。我是否需要调用sv*上的sv2mortal
,如果我没有将其推到堆栈上,该sv*将被返回
(顺便说一句,我真的是在研究一个不太实用的C语言知识,这让我很痛苦。我有一个认识C语言的朋友在帮助我,但他一点Perl都不懂)
我在下面提供一个样本。函数FLIGetLibVersion
只是将库版本的len
字符放到char*ver
上。我的问题是version\u是否会返回我的C代码泄漏内存的形式
注意:欢迎对本规范提出任何其他意见
#!/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;
}
现在,当我运行脚本时,我得到了与之前相同的输出,并附加了一个额外的警告。以下是输出:
Software Development Library for Linux 1.99
Software Development Library for Linux 1.99
Attempt to free unreferenced scalar: SV 0x2308aa8, Perl interpreter: 0x22cb010.
我想这意味着在这种情况下我不需要死亡?我怀疑错误是说我标记了一些已经在收集线上的东西。有人能帮我确认一下这个警告是什么意思吗?我已经维护Set::Object很多年了,也有这个问题——也许最好看看代码的源代码,看看什么时候东西应该被淘汰(github.com/samv/Set Object)。我知道Set::Object在多次更改之后就有了它。我想,只要你把SV推到返回堆栈上。不知道内联是如何改变这一切的。我不知道Perl,更不用说如何将它与C。。。但是,如果您的代码是纯旧的C,并且libfli.h
中没有“技巧”,那么行Inline\u Stack\u Vars代码>,内联堆栈重置代码>和内联\u堆栈\u完成代码>没有任何功能。@pmg,Perl和C之间有很多神奇之处;这些函数是在编译前自动读取的头文件中定义的。您已经尝试过了吗?@hlynur,我确实快速查看了一下,但我担心它会遇到一些与我的XS尝试相同的问题,即我不知道如何成功使用它。库需要使用makefile编译成.so,因此使用h2xs
对我来说很困惑,我想swig-perl5…
也一样。最后,我可能需要编写自己的XS,因为库中有一个令人困惑的机制,它不能很好地映射到Perl,至少不是习惯用法。我的问题仍然与所有这些无关,我到了那里就开始问这个问题。
Software Development Library for Linux 1.99
Software Development Library for Linux 1.99
Attempt to free unreferenced scalar: SV 0x2308aa8, Perl interpreter: 0x22cb010.