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

时间:2019-01-15 16:49:21

标签: c++ protocol-buffers

假设在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");
}

谁将负责删除使用new创建的对象?我知道,如果您使用set_allocated函数,那么除非您调用release,否则protobuf将负责删除,但是对于重复的字段,它又如何呢?

2 个答案:

答案 0 :(得分:3)

不要将new与protobuf一起使用,通常不是您想要的。按照书面规定,您正在泄漏内存。

此外,您的代码将无法按照编写的方式进行编译。这是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");
}

答案 1 :(得分:2)

  

谁将负责删除使用new创建的对象?

使用new创建对象的人。

您使用new创建了对象,因此您有责任删除它。

  

我知道,如果您使用set_allocated函数,那么除非您调用release

,否则protobuf将负责删除

正确。如果将指针的所有权转移到其他地方,则删除的责任与所有权有关。如果您不转让所有权(如示例程序中所示),则责任仍然在您身上。如果不删除它,则内存泄漏。