添加到重复字段的指针会被自动删除吗?
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 中,如果删除了集合,索引也会自动删除吗?