glib - Vala 字符串处理会损坏内存。为什么以及如何避免?

标签 glib vala memory-corruption

我不确定我是否误用了 Vala 或 GLib.Regex,因为我对这两者都是新手。我创建了一个最小的示例,它重现了该错误。从以下代码中,我期望它打印 a INPUTX b 六次,并交替使用 sourceresult 前缀:

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.

因此,当我们分配stringregex.replace 返回的对象到unowned string src ,该引用是 ( see )

not recorded in the object

Vala 编译器认为它可以安全地处置 - 尽管还不清楚为什么这种情况会发生,特别是在循环体的末尾。

所以直接的解决方案是声明 src参数为 owned .

关于glib - Vala 字符串处理会损坏内存。为什么以及如何避免?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38894101/

相关文章:

introspection - 如何从 Vala 编译器生成 GIR 文件?

gtk - 瓦拉 Gtk 模板 : UI Resource not found

c++ - 如何调试非确定性内存损坏?

c++ - 如何等待 Glib::Dispatcher 的连接函数完成?

gtk - 我应该学习 GObject 和 GLib 才能使用 GTK 吗?

debugging - 如何让 GDB 在 GLib 断言失败时中断?

c++ - 如何找到导致 "malloc(): memory corruption: 0x00"的行

c - 迭代 GList 的宏

gtk - 如何使用滚动条滚动 Clutter.ScrollActor?

c++ - 如何检查C++中的内存损坏