假设在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将负责删除,但是对于重复的字段,它又如何呢?
答案 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
创建了对象,因此您有责任删除它。
我知道,如果您使用
,否则protobuf将负责删除set_allocated
函数,那么除非您调用release
正确。如果将指针的所有权转移到其他地方,则删除的责任与所有权有关。如果您不转让所有权(如示例程序中所示),则责任仍然在您身上。如果不删除它,则内存泄漏。