Приложение падает, когда я не использую free () - PullRequest
0 голосов
/ 03 апреля 2019

Приложение аварийно завершает работу при попытке инициализировать переменные после использования malloc ().

Использование free () или размещение неисправного блока кода поверх других 2, решает все проблемы, но почему?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

int main()
{
    LARGE_INTEGER startTime, endTime, ticksPerSecond;
    int a = 10000;
    int b = 25000;
    float *allocazione;
    QueryPerformanceFrequency(&ticksPerSecond);

    QueryPerformanceCounter(&startTime);
    allocazione = (float*)malloc(a*b*sizeof(float));
    QueryPerformanceCounter(&endTime);
    printf("Tempo di allocazione con malloc : \n%g\n", (double)(endTime.QuadPart - startTime.QuadPart)/(double)ticksPerSecond.QuadPart);

    free(allocazione); //Commenting this causes the application to crash. Why?

    QueryPerformanceCounter(&startTime);
    allocazione = (float*)calloc(a*b,sizeof(float));
    QueryPerformanceCounter(&endTime);
    printf("Tempo di allocazione con calloc : \n%g\n", (double)(endTime.QuadPart - startTime.QuadPart)/(double)ticksPerSecond.QuadPart);

    free(allocazione); //Commenting this causes the application to crashes. Why?

    //Having the piece of code on top solves all the issues. Why?
    QueryPerformanceCounter(&startTime);
    allocazione = (float*)malloc(a*b*sizeof(float));
    for(int i = 0; i < a; i++)
        for (int j = 0; j < b; j++)
        *(allocazione + i * b + j) = 0.0f; //Application crash!!!
    QueryPerformanceCounter(&endTime);
    printf("Tempo di allocazione con malloc + for loop per inizializzare : \n%g\n", (double)(endTime.QuadPart - startTime.QuadPart)/(double)ticksPerSecond.QuadPart);

    return 0;
}

1 Ответ

3 голосов
/ 03 апреля 2019

Каждое из ваших выделений рассчитано на 250 миллионов float с, что требует значительного гигабайта памяти. Скорее всего, вы создаете 32-разрядное приложение, и это означает, что у вас есть только 2 ГБ (возможно, 3 ГБ для специальной конфигурации ОС) адресного пространства пользовательской виртуальной памяти.

Если не набрать free, вы пытаетесь выделить три блока по 1 ГБ на единицу, что не подходит; вероятно, один из вызовов malloc или calloc не выполнен, и вы не проверяете возвращаемое значение, поэтому даже не видите его. Когда вы пытаетесь использовать возврат NULL из неудавшегося выделения, происходит сбой.

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