Как освободить память после const char * malloc? - PullRequest
0 голосов
/ 07 мая 2018

У меня проблема с утечками памяти

У меня есть цикл, который читает данные на EXCEL с библиотекой LibXL.

    Book* book3 = xlCreateXMLBook();

    if (book3->load("Výmera Územia, využitie pôdy.xlsx")) {
        CellType cellType;
        Sheet* sheet = book3->getSheet(0);
        while (startIndex <= 100 * countOfLoad) {
            int k = 1;
            int numberOfBlank = 0;
            const char* name = sheet->readStr(startIndex, 0);
            nameOfVillage = name;
            free ((void*) name);
            ...
       }
       ...
   }

const char* name = sheet->readStr(startIndex, 0); - читает строку и ее формат из ячейки.

Память выделена для внутреннего использования и действует до тех пор, пока не будет загружена новая рабочая книга или не будет вызван Book::release() для двоичной реализации (xls).

Но необходимо каждый раз копировать строку результата в реализации xml (xlsx).

НО, когда я пишу free ((void*) name) Дай мне ошибку:

Test(24919,0x1025bb380) malloc: *** error for object 0x10dacb738: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

Когда мой цикл идет после 158 времени чтения строки, эта программа останавливает чтение, потому что память заполнена, я должен удалить память после чтения строки.

Кто-нибудь может помочь? THX

1 Ответ

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

Из документации readStr (http://libxl.com/spreadsheet.html#readStr)

Память распределяется внутри и действует до тех пор, пока не будет загружена новая рабочая книга или не будет вызвана Book :: release () для двоичной реализации (xls). Но необходимо каждый раз копировать строку результата в реализации xml (xlsx).

Это означает, что вам нужно позвонить Book::release(), когда вы закончите работу с книгой, чтобы освободить эту память.

Так что не звоните free по указателям, которые вы получаете из этой библиотеки.

-Or- сообщить об ошибке авторам LibXL.

-Или использовать больше памяти из freestore для ваших переменных.

...