我还没弄清楚导致它的原因,但我想知道是否会对错误(警告?)消息产生任何影响“尝试释放未引用的标量:SV 0x825b790在全局销毁期间”。对于未经训练的人来说,似乎由于编译器不愿意检测到问题,因此它没有继续并重新删除未引用的内存。
这只是告诉我,我的编程很草率吗?或者是否存在我应该关注的真正问题?
背景:这不是我的代码,我没有时间去追捕这个问题,我应该注意到它正在程序结束时发生。
答案 0 :(得分:8)
这是XS模块或Perl本身的错误。这意味着已经请求释放已经解除分配的标量。
这表明某些代码持有一个它认为有效的指针,但不是。这可能导致代码写入内存,代码不应该修改,这可能导致数据完整性问题,段错误等。
程序退出时检测到,但问题可能随时发生。从释放错误到发出错误之前,您会遇到问题。
例如,
use Inline C => <<'__EOI__';
void buggy(SV* sv) {
SvREFCNT_dec(sv);
}
__EOI__
my $x;
buggy($x);
# $x is no longer allocated here, but I could still try to use it.
输出:
Attempt to free unreferenced scalar: SV 0xc43fc0, Perl interpreter: 0xc22690.