是否需删除指向Protobuf消息的指针?改用shared_ptr是否可行?
Protobuf消息对象内存管理疑问解答
相关代码
Protobuf定义:
message Bar {}
C++代码:
int vec_size = 100; std::vector<Bar*> vec; vec.reserve(vec_size); // 注:原代码里的`reverse`是笔误,正确写法为`reserve` for (int i = 0; i < vec_size; i++) { vec.push_back(new Bar()); } // other code. //call some functions; // I think we need to do this if the vec is no longer used. for (int i = 0; i < vec_size; i++) { delete vec[i]; }
问题1:Protobuf消息对象是否需要手动删除指针?
需要。你用new创建的Bar对象和普通C++堆对象完全一致,Protobuf框架仅负责管理消息内部成员(比如字符串、嵌套消息)的内存,顶层对象的生命周期必须由开发者自行把控。
你代码里最后循环delete的操作是必须的,漏掉会直接造成内存泄漏。
问题2:换成std::vector<std::shared_ptr<Bar>>是否合理?
非常合理,这是现代C++中更安全的内存管理方案:
shared_ptr会自动跟踪对象的引用计数,当最后一个指向该对象的智能指针被销毁时,自动调用delete释放内存,无需手动编写删除循环,能避免因代码分支复杂、遗漏删除导致的泄漏。- 如果不需要多个指针共享对象所有权,更推荐轻量的
std::unique_ptr<Bar>,对应的容器为std::vector<std::unique_ptr<Bar>>,同样能实现自动内存管理。
另外提一句,Protobuf本身提供了Bar::New()静态方法创建对象,搭配google::protobuf::ScopedPtr也能自动管理内存,但在C++11及以后,标准库的智能指针通用性更强,优先使用标准库方案更稳妥。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

