如何释放协议缓冲区内存


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后,程序仍然cc占用了190M物理内存,因为没有释放内存,我不知道为什么。

有一个函数可以释放C++内存:

google::protobuf::ShutdownProtobufLibrary();

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

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

您可能想要调用它有两个原因:

  • 使用了一个严厉的"内存泄漏"定义,你希望每个malloc((都有一个相应的free((,即使对于 一直存在到程序退出的对象。
  • 您正在编写一个动态加载的库,该库需要在卸载库时自行清理。

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

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

C/C++ 内存分配函数不会将释放的内存返回到操作系统,而是将其保留在自己的列表中以满足将来的分配,这是很常见的。

例如,如果使用new分配 190 MB 的阵列,那么delete它,操作系统工具很可能仍会显示该程序已使用 190 MB。但是,要查看该函数是否真的泄漏内存,您可以运行它两次。如果它泄漏了内存,第二次使用后它将占用 380 MB - 但如果它释放了内存,它将重复使用相同的 190 MB。

通常,此行为可在C++运行时中进行配置。但是,已选择默认值,以便它们最适合常见用例。

最新更新