You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否需删除指向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:40:25