我不确定我是否误用了 Vala 或 GLib.Regex
,因为我对这两者都是新手。我创建了一个最小的示例,它重现了该错误。从以下代码中,我期望它打印 a INPUTX b
六次,并交替使用 source
和 result
前缀:
public class Test
{
public static void run( string src )
{
var regex = new Regex( "INPUT[0-9]" );
for( int i = 0; i < 3; ++i )
{
stdout.printf( @"-- source: $src\n" );
src = regex.replace( src, -1, 0, "value" );
stdout.printf( @"-- result: $src\n\n" );
}
}
public static void main()
{
Test.run( "a INPUTX b" );
}
}
我根据 the example in the docs 编写了这段代码。但是,在使用 valac Test.vala --pkg glib-2.0
编译并运行后,我得到:
-- source: a INPUTX b
-- result: a INPUTX b
-- source: -- source:
-- result: N�
-- source: -- source:
-- result: PN�
我做错了什么?
最佳答案
在查看生成的 C 代码后,我得出结论,这是一个与 Vala 相关的问题:Vala 放置了 g_free
到循环体的末尾,这会释放 g_regex_replace
返回的内存,并且由 src
引用。但瓦拉为什么要这么做呢?
原因是(see)
arguments are, by default, unowned.
因此,当我们分配string
时regex.replace
返回的对象到unowned string src
,该引用是 ( see )
not recorded in the object
Vala 编译器认为它可以安全地处置 - 尽管还不清楚为什么这种情况会发生,特别是在循环体的末尾。
所以直接的解决方案是声明 src
参数为 owned
.
关于glib - Vala 字符串处理会损坏内存。为什么以及如何避免?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38894101/