代码之家  ›  专栏  ›  技术社区  ›  Nidhoegger

添加到重复字段的指针是否会自动删除?

  •  0
  • Nidhoegger  · 技术社区  · 5 年前

    假设在Google Protobuf中我定义了以下消息:

    message address
    {
        String street = 1;
        String name = 2;
    }
    
    message address_list
    {
        repeated address addrs = 1;
    }
    

    我会将地址添加到已分配的地址列表中:

    protobuf::address_list addrs;
    
    for (int i = 1; i < 10; ++i)
    {
        protobuf::address *addr = addrs.add_addrs();
        addr->set_street("foo");
        addr->set_name("bar");
    }
    

    谁将负责删除新创建的对象?我知道如果你用 set_allocated 函数,除非调用 release ,但如何处理重复字段?

    2 回复  |  直到 5 年前
        1
  •  3
  •   druckermanly    5 年前

    不要使用 new 对于原虫,它通常不是你想要的。如文所述,你在泄露记忆。

    此外,您的代码不会按照编写的那样编译。这里是 the spec for repeated fields ,但简而言之,要在这样的循环中添加元素,您应该具有如下代码:

    protobuf::address_list addrs;
    for (int i = 1; i < 10; ++i)
    {
        // This is a non-owning pointer. No delete necessary.
        protobuf::address *addr = addrs.add_addr();
        addr->set_street("foo");
        addr->set_name("bar");
    }
    
        2
  •  2
  •   eerorika    5 年前

    谁将负责删除新创建的对象?

    创建对象的人使用 new .

    创建对象时使用 新的 ,因此您负责删除它。

    我知道如果你用 set_allocated 函数,除非调用 release

    对的。如果您将指针的所有权转移到其他地方,那么删除的责任将与所有权一起承担。如果您不转移所有权(如示例程序中所示),那么责任仍在您身上。如果你不删除它,那么内存就会泄漏。