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

Posted

技术标签:

【中文标题】添加到重复字段的指针会被自动删除吗?【英文标题】:Will a pointer that has been added to a repeated field be deleted automatically? 【发布时间】:2019-01-15 16:49:20 【问题描述】:

假设我在 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 将负责删除,但是重复字段如何?

【问题讨论】:

【参考方案1】:

不要将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");

【讨论】:

谢谢。我是从内存中写出来的,作为一个小例子。所以如果我理解正确的话,那么使用你给出的方法,我就不需要delete指向地址的指针了。【参考方案2】:

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

使用new 创建对象的人。

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

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

正确。如果您将指针的所有权转移到其他地方,则删除的责任与所有权有关。如果您不转移所有权(如示例程序中所示),则责任仍由您承担。如果你不删除它,那么内存泄漏。

【讨论】:

以上是关于添加到重复字段的指针会被自动删除吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 MongoDB 中,如果删除了集合,索引也会自动删除吗?

cpp中的析构函数会自动调用吗?即使析构函数没有提及非动态变量,它们是不是也会被删除?

使用猫鼬生成自动增量字段?

我可以删除指针但保留变量吗[关闭]

当它重复时,你会删除你自己的答案吗?

删除字段时,Chrome 自动填充会重新填充输入