rapidJson:在发布模式下崩溃了

时间:2017-07-31 21:01:04

标签: crash release rapidjson

我使用rapidJson来读取json数据。我可以在Debug和Release模式下构建我的应用程序,但应用程序在Release模式下崩溃。

    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
    }  

它在调试模式下运行良好。

2 个答案:

答案 0 :(得分:0)

对于memory leak,可能会出现Malloc问题,因为它在Debug中运行一次很好,但是当你保持应用程序运行时间更长时它会崩溃。

使用后freebuffer了吗?

答案 1 :(得分:0)

原因很简单。您分配了fileSize个字节的缓冲区,但是在读取文件之后,使用buffer[fileSize] = 0;

在fileSize + 1位置写入

修正:将分配分配大一倍。

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

Debug使用其他字节构建填充内存分配,因此不会崩溃。