是否会自动删除已添加到重复字段的指针
Will a pointer that has been added to a repeated field be deleted automatically?
假设在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
正确。如果将指针的所有权转移到其他地方,则删除的责任也随所有权一起承担。如果您不转让所有权(如示例程序所示),则责任仍由您承担。如果不删除它,则内存会泄漏。
相关文章:
- 更改保留指向其字段的原始指针的对象地址
- 指向结构中的数组的指针,其中每个字段都是一个动态数组
- 将指向结构的指针转换为具有较少字段数的另一种结构类型
- 如何使用指向该数组的指针访问结构数组中包含的结构中的字段?[C++]
- C++ 通过指针更改 char* 类字段
- 是否会自动删除已添加到重复字段的指针
- 通过另一个对象C++的字段中的指针访问对象
- 结构字段上的智能指针
- 模板类c中的析构函数:如何删除可能是指针或不是指针的字段?
- 如果超构造函数不使用派生类字段,是否可以将该指针传递给该指针?
- C++:为智能指针的字段隐式保留右值引用
- 类指针字段,类型为变量(有点)
- 在指针指向指针字段的场景中访问值,每个指针都指向 int
- 使用指向成员的指针读取 cons 对象的字段的值
- 如何将指向基类的指针保存到另一个类的字段
- 在C++类中使用指针作为成员字段是不是很傻
- 使用此指针指向类中的位字段
- 是否声明抽象类型的字段?首选指针或引用
- 指向重复GPB字段项的指针是否在该字段被修改时仍然有效
- 在编译时比较静态字段指针