Страницы

Поиск по вопросам

вторник, 16 июля 2019 г.

Динамическое выделение памяти. Что не удаляется самостоятельно?

Есть код:
#include "dparser.hpp"
namespace tools {
string parseToString(const char* _fileName, const char* _needBlockName) { ifstream file(_fileName);
if (!file.is_open()) { printf("Parser-Error-E001: Could not open file!
"); exit(1); }
char bufferString[MAX_STR_LEN]; string finalString; register bool blockIsFind = false;
while (file.getline(bufferString, MAX_STR_LEN)) { if (!blockIsFind) { if (!strcmp(bufferString, _needBlockName)) { blockIsFind = true; }
continue; }
if (bufferString[0] == '#') { continue; }
if (!bufferString[0]) { break; }
finalString += bufferString; finalString.push_back('
');
} // end while
file.close();
if (!finalString.size()) { printf("GameTextData-Parser-Error-E002: Block not found!
"); exit(2); }
finalString.erase(remove(finalString.begin(), finalString.end(), '"'), finalString.end()); finalString.pop_back();
string::size_type charPosition = 0;
while ((charPosition = finalString.find( "''", charPosition)) != string::npos) { finalString.replace(charPosition, 2, 1, '"'); ++charPosition; }
return finalString; }
void parseAndPrint(const char* _fileName, const char* _needBlockName) { string finalString = parseToString(_fileName, _needBlockName); printf("%s
", finalString.c_str()); }
} // end of 'namespace tools'
int main(int argc, char const *argv[]) { tools::parseAndPrint(argv[1], argv[2]); return 0; }
При проверке Valgrind'ом пишет:
==11211== HEAP SUMMARY: ==11211== in use at exit: 18,944 bytes in 1 blocks ==11211== total heap usage: 4 allocs, 3 frees, 27,511 bytes allocated ... ... ==11211== For counts of detected and suppressed errors, rerun with: -v ==11211== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Как видите, 4 allocs и 3 frees, на сколько я знаю, так быть не должно. Что сдесь не удаляется и как правильно это что-то удалить? А также еще один вопрос: локальные переменные функций parseToString и parseAndPrint удаляться, после завершения работы своих функций или нет?
UPD
Код dparser.hpp
#ifndef _DPARSER_HPP_ #define _DPARSER_HPP_
#include #include #include #include
#define MAX_STR_LEN 151
using std::string; using std::replace; using std::ifstream;
namespace tools { string parseToString(const char *data_file_name, const char *need_block_name); void parseAndPrint(const char *data_file_name, const char *need_block_name); }
#endif // _DPARSER_HPP_
UPD
Данные, которые читаю в цикле (data.gtd):
[help] "This is ''help''!"
[lph] "Hahahhahah"
[main] "This is main"


Ответ

Благодаря расследованию avp и Vlad from Moscow, я понял, что локальные переменные после работы функций удаляются и в программе нет утечки памяти - все из-за расхождений в версиях Valgrind

Комментариев нет:

Отправить комментарий