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

Will a pointer that has been added to a repeated field be deleted automatically?

本文关键字:字段 指针 添加 删除 是否      更新时间:2023-10-16

假设在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 函数,protobuf 将负责删除,除非您调用 release ,但是重复字段的情况如何?

不要将new与 protobufs 一起使用,它通常不是你想要的。正如所写,你正在泄漏内存。

此外,您的代码不会按编写的方式进行编译。这是重复字段的规范,但简而言之,要在这样的循环中添加元素,您应该具有如下代码:

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

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

谁使用 new 创建对象。

您是使用 new 创建的,因此您有责任删除它。

我知道如果您使用 set_allocated 函数,protobuf 将负责删除,除非您调用release

正确。如果将指针的所有权转移到其他地方,则删除的责任也随所有权一起承担。如果您不转让所有权(如示例程序所示),则责任仍由您承担。如果不删除它,则内存会泄漏。