如何释放 Protocol Buffer 内存

2024-02-11

message LongUserIdSeqIdMapData {
map<int64, int32> userid_seqid = 1;
map<int32, int64> sedid_userid = 2; }

void GetUserIdSeqId(const std::string &user_id_seq_id_file) {
std::ifstream infile(user_id_seq_id_file);
infile.seekg(0, infile.end);
size_t length = infile.tellg();
infile.seekg(0, infile.beg);
auto *buffer = new char[length];
infile.read(buffer, length);
auto long_user_id_seq_id_map = new com::jaymz::poseidon::LongUserIdSeqIdMapData::LongUserIdSeqIdMapData();
if (!(*long_user_id_seq_id_map).ParseFromArray(buffer, length)) {
    std::cout << "Parse user_id_seq_id_file Fail, Please Check Your File!" << std::endl;
} else {
    std::cout << "Parse user_id_seq_id_file Success" << std::endl;
}
delete[] buffer;
delete long_user_id_seq_id_map;

}

我首先将LongUserIdSeqIdMapData数据写入文件,然后通过调用函数GetUserIdSeqId从文件中解析它,我发现程序在执行GetUserIdSeqId时占用了190M物理内存,但是执行完GetUserIdSeqId后,程序仍然占用190M物理内存,因为没有释放内存,我不知道为什么。


C++中有一个释放内存的函数:

google::protobuf::ShutdownProtobufLibrary();

https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.common#ShutdownProtobufLibrary.details https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.common#ShutdownProtobufLibrary.details

关闭整个protocol buffers库,删除所有 由库或生成的静态持续时间对象分配 .pb.cc 文件。

您可能想这样称呼有两个原因:

  • 您使用“内存泄漏”的严格定义,其中您期望每个 malloc() 都有相应的 free(),即使对于 一直存活到程序退出的对象。
  • 您正在编写一个动态加载的库,在卸载库时需要自行清理。

多次调用它是安全的。但使用起来并不安全 之后的协议缓冲区库的任何其他部分 ShutdownProtobufLibrary() 已被调用。

这应该可以解决你的问题!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何释放 Protocol Buffer 内存 的相关文章

随机推荐