更新:何时"Peralize"Perl Inline :: C中的变量

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 如何改变这一切。