Как освободить память протокола буфера - PullRequest
0 голосов
/ 18 мая 2018
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. Я обнаружил, что программа заняла 190M физической памяти при выполнении GetUserIdSeqId, но после завершения выполнения GetUserIdSeq, программа все еще занимала 190M физической памяти, так как память не освобождается, я не знаю почему.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Есть функция, которая освобождает память в C ++:

google::protobuf::ShutdownProtobufLibrary();

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

Завершить работу всей библиотеки буферов протокола, удалив все выделенные объекты статической длительностибиблиотекой или сгенерированными файлами .pb.cc.

Существует две причины, по которым вы можете захотеть назвать это:

  • Вы используете драконовское определение «утечки памяти», в которомвы ожидаете, что каждый отдельный malloc () будет иметь соответствующий free (), даже для объектов, которые живут до завершения программы.
  • Вы пишете динамически загружаемую библиотеку, которую нужно очистить после себя, когда библиотека выгружена.

Можно вызывать это несколько раз.Однако после вызова ShutdownProtobufLibrary () небезопасно использовать любую другую часть библиотеки буферов протокола.

Это должно решить вашу проблему!

0 голосов
/ 19 мая 2018

Довольно часто функции выделения памяти в C / C ++ не возвращают освобожденную память операционной системе, а хранят ее в своем собственном списке для удовлетворения будущих распределений.

Например, если вы используетеnew для выделения массива 190 МБ, затем delete, вполне вероятно, что инструменты операционной системы все равно покажут, что программа использовала 190 МБ.Однако, чтобы увидеть, действительно ли функция теряет память, вы можете запустить ее дважды.Если произойдет утечка памяти, после второго использования потребуется 380 МБ, но если она освободит память, она будет использовать те же 190 МБ.

Часто такое поведение настраивается в среде выполнения C ++.Но значения по умолчанию были выбраны таким образом, чтобы они наиболее подходили для общих случаев использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...