C++ 如何释放协议缓冲区内存 消息LongUserIdSeqIdMapData{ map userid_seqid=1; 映射sedid_userid=2;} void GetUserIdSeqId(const std::string和user_id_seq_id_文件){ std::ifstream infle(用户id\u seq\u id\u文件); 填充参见kg(0,填充结束); size_t length=infle.tellg(); 填充seekg(0,填充beg); 自动*缓冲区=新字符[长度]; 填充读取(缓冲区、长度); auto long_user_id_seq_id_map=新com::jaymz::poseidon::LongUserIdSeqIdMapData::LongUserIdSeqIdMapData(); if(!(*long\u user\u id\u seq\u id\u map).ParseFromArray(缓冲区,长度)){ std::cout

C++ 如何释放协议缓冲区内存 消息LongUserIdSeqIdMapData{ map userid_seqid=1; 映射sedid_userid=2;} void GetUserIdSeqId(const std::string和user_id_seq_id_文件){ std::ifstream infle(用户id\u seq\u id\u文件); 填充参见kg(0,填充结束); size_t length=infle.tellg(); 填充seekg(0,填充beg); 自动*缓冲区=新字符[长度]; 填充读取(缓冲区、长度); auto long_user_id_seq_id_map=新com::jaymz::poseidon::LongUserIdSeqIdMapData::LongUserIdSeqIdMapData(); if(!(*long\u user\u id\u seq\u id\u map).ParseFromArray(缓冲区,长度)){ std::cout,c++,memory,memory-leaks,protocol-buffers,C++,Memory,Memory Leaks,Protocol Buffers,很常见的情况是,C/C++内存分配函数不将释放的内存返回给操作系统,而是将其保留在自己的列表中以满足将来的分配 例如,如果您使用new分配一个190 MB的数组,然后删除它,很可能操作系统工具仍会显示该程序使用了190 MB。但是,要查看该函数是否确实存在内存泄漏,您可以运行两次。如果该函数泄漏内存,第二次使用后将需要380 MB—但如果我t已释放内存,它将重用相同的190MB 这种行为通常在C++运行时是可配置的,但是默认值已经被选中,以使它们最适合于常用的情况。 < P>有一个函数,在C++

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

例如,如果您使用
new
分配一个190 MB的数组,然后
删除它,很可能操作系统工具仍会显示该程序使用了190 MB。但是,要查看该函数是否确实存在内存泄漏,您可以运行两次。如果该函数泄漏内存,第二次使用后将需要380 MB—但如果我t已释放内存,它将重用相同的190MB


这种行为通常在C++运行时是可配置的,但是默认值已经被选中,以使它们最适合于常用的情况。

< P>有一个函数,在C++中释放内存:

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;

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

有两个原因可以将其命名为:

  • 使用“内存泄漏”的严格定义,期望每个malloc()都有相应的free(),即使对于 在程序退出之前一直存在的对象
  • 您正在编写一个动态加载的库,在卸载库时需要对其自身进行清理
多次调用此选项是安全的。但是,使用此选项并不安全 协议缓冲区库的任何其他部分 已调用ShutdownProtobufLibrary()


这会解决你的问题!< /p>砍掉它并隔离占用你内存的代码块。像Valgrind这样的工具会有帮助。无关的,为什么<代码>新< /代码>什么?<代码>缓冲区< /代码>可以是<代码>矢量< /代码>,如果不能自动分配龙USERIDSEQIDMADATA,你应该考虑使用其他东西。ted:获取文件大小的seek-then-tell技巧并不总是有效。你是如何确定大小的?你可能在观察操作系统的行为,而不是你的程序。除非你用Valgrind的“Massif”之类的东西分析过它工具,你不知道使用内存堆有多大。OSS谎言。他们会超速。他们的内存是虚拟的,不是真实的。计算机的负载比70年代要复杂。谢谢你的回答。如何在C++运行时配置这个行为?@ ZeMeMangWangWangMeLee是你正在使用的C++编译器的文档。,或者,如果这没有帮助,请询问一个新问题,其中包含有关平台的详细信息。不会修复生成文件中的AddDescriptor调用

google::protobuf::ShutdownProtobufLibrary();