RapidJson: сбой в режиме выпуска

Я использовал rapidJson для чтения данных json. Я могу создать свое приложение как в режиме отладки, так и в режиме выпуска, но приложение вылетает в режиме выпуска.

    using namespace rapidjson;
    ...
    char *buffer;
    long fileSize;
    size_t fileReadingResult;

    //obtain file size
    fseek(pFile, 0, SEEK_END);
    fileSize = ftell(pFile);
    if (fileSize <= 0) return false;
    rewind(pFile);

    //allocate memory to contain the whole file
    buffer = (char *)malloc(sizeof(char)*fileSize);
    if (buffer == NULL) return false;

    //copy the file into the buffer
    fileReadingResult = fread(buffer, 1, fileSize, pFile);
    if (fileReadingResult != fileSize) return false;
    buffer[fileSize] = 0;

    Document document;
    document.Parse(buffer);

Когда я запускаю его в режиме выпуска, я обнаруживаю Unhanded exception; A heap has been corrupted. Приложение прерывается на "res = _heap_alloc(size) в malloc.c файле

void * __cdecl _malloc_base (size_t size)
{
     void *res = NULL;

//  validate size
if (size <= _HEAP_MAXREQ) {
    for (;;) {

        //  allocate memory block
        res = _heap_alloc(size);

        //  if successful allocation, return pointer to memory
        //  if new handling turned off altogether, return NULL

        if (res != NULL)
        {
            break;
        }
        if (_newmode == 0)
        {
            errno = ENOMEM;
            break;
        }

        //  call installed new handler
        if (!_callnewh(size))
            break;

        //  new handler was successful -- try to allocate again
    }  

Он отлично работает в режиме отладки.


person Hyundo Jung    schedule 31.07.2017    source источник


Ответы (2)


Возможно, это может быть memory leak проблема с вашим Malloc, поскольку он один раз работает нормально в отладке, но когда вы держите приложение дольше, оно вылетает.

Вы free свой buffer после его использования?

person Jacobb    schedule 21.08.2017

Причина проста. Вы выделяете буфер размером fileSize байтов, но после чтения файла вы пишете в позиции fileSize + 1 с помощью buffer[fileSize] = 0;

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

buffer = (char *)malloc(fileSize + 1);

При отладке выделяется дополнительная память с дополнительными байтами, поэтому сбой не происходит.

person Yogurt    schedule 14.09.2020