Joe*_*ger 5 c perl memory-leaks inline
我正在尝试将C库包装到Perl中.我已经修改XS但是没有成功我认为我应该简单地开始Inline::C.我的问题是关于致死.我一直在尽力阅读perlguts,但我仍然感到困惑.sv_2mortal如果我没有把它推到堆栈上,我是否需要调用要返回的SV*?
(PS我真的正在研究一种不太有功能的C知识,它伤害了我.我有一个知道C帮助我的朋友,但他不知道任何Perl).
我在下面提供一个样本.该函数FLIGetLibVersion只是将len库版本的字符放在char*上ver.我的问题是version_return我的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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
为了尝试自己回答这个问题,我尝试将线路更改为
SV* ret = sv_2mortal(newSVpv(ver, strlen(ver)));
Run Code Online (Sandbox Code Playgroud)
现在,当我运行脚本时,我获得了与之前相同的输出以及额外的警告.这是输出:
Software Development Library for Linux 1.99
Software Development Library for Linux 1.99
Attempt to free unreferenced scalar: SV 0x2308aa8, Perl interpreter: 0x22cb010.
Run Code Online (Sandbox Code Playgroud)
我想这意味着我不需要在这种情况下致命?我怀疑这个错误是说我标记了收集已经排队的东西.有人可以向我确认那个警告意味着什么吗?
小智 1
我多年来一直维护 Set::Object ,也有这个问题 - 也许最好查看该代码的源代码,看看什么时候应该将东西销毁(github.com/samv/Set-Object)。我知道 Set::Object 经过多次更改后就已经有了它。但我认为,每当你将 SV 推入返回堆栈时。不知道 Inline 如何改变这一切。