加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 23:32:29 所属栏目:大数据 来源:网络整理
导读:我正在尝试将C库包装到Perl中.我已经修改了XS但是不成功我认为我应该简单地使用Inline :: C.我的问题是关于致死.我一直在尽力阅读perlguts,但我仍然感到困惑.如果我没有将它推入堆栈,我是否需要在要返回的SV *上调用sv_2mortal? (PS我真的正在研究一种不太
我正在尝试将C库包装到Perl中.我已经修改了XS但是不成功我认为我应该简单地使用Inline :: C.我的问题是关于致死.我一直在尽力阅读perlguts,但我仍然感到困惑.如果我没有将它推入堆栈,我是否需要在要返回的SV *上调用sv_2mortal?

(PS我真的正在研究一种不太有功能的C知识,它伤害了我.我有一个知道C帮助我的朋友,但他不知道任何Perl).

我在下面提供一个样本.函数FLIGetLibVersion只是将库版本的len个字符放在char * ver上.我的问题是我的C代码的version_return形式会泄漏内存吗?

注:欢迎任何其他关于此代码的评论.

#!/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.

我想这意味着我不需要在这种情况下致命?我怀疑这个错误是说我标记了收集已经排队的东西.有人可以向我确认那个警告意味着什么吗?

解决方法

我一直在维护Set :: Object多年并且也有这个问题 – 也许最好看一下代码的来源,看看什么时候应该被诅咒(github.com/samv/Set-Object).我知道Set :: Object在经过多次更改后才能正确使用它.我想,无论何时你将SV推到返回堆栈上.不确定Inline如何改变这一切.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读