Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新:何时“更新”;“致死”;Perl内联::C中的变量_C_Perl_Memory Leaks_Inline - Fatal编程技术网

更新:何时“更新”;“致死”;Perl内联::C中的变量

更新:何时“更新”;“致死”;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上。我

我试图将C库包装成Perl。我已经修补了
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.