C массив char * полностью свободная память во время выполнения - PullRequest
0 голосов
/ 14 сентября 2018

Я хочу понять, почему этот скрипт не освобождает полностью его память.Память Windows, используемая в диаграмме, немного уменьшилась из общего объема выделенных 400 МБ.Вся память свободна с массивом int, но не с массивом char *

Как это сделать правильно?Большое спасибо за вашу помощь ...

void testAlloc() {
unsigned char error = 0;
char **arr;
char **buf;
size_t size = 1;
size_t idx = 0;
size_t nextIdx;
size_t newSize;

arr = calloc(size, sizeof(char*));

while(idx < 9999999) {
    nextIdx = idx+1;
    newSize = nextIdx*2;
    if(nextIdx > size) {
        buf = realloc(arr, newSize * sizeof(char*));
        if(buf != NULL) {
            arr = buf;
            size = newSize;
            }else{
                error = 1;
                }
        }
    if(!error) {
        arr[idx] = calloc(32, sizeof(char));
        arr[idx] = "sample text";
        }
    idx++;
    }

MessageBox(NULL, "stop before free", "", MB_OK);

size_t i = 0;
if(!error && arr != NULL) {
    while(i < idx) {
        free(arr[i]);
        i++;
        }
    free(arr);
    arr = NULL;
    }
}
testAlloc();

1 Ответ

0 голосов
/ 14 сентября 2018

Здесь:

        arr[idx] = calloc(32, sizeof(char));
        arr[idx] = "sample text";

Вы выделяете 32 байта памяти и сохраняете указатель на них в arr[idx], затем вы перезаписываете этот указатель указателем на массив, представленный строковым литералом. Динамическое распределение просочилось. Кроме того, позднее вы вызываете неопределенное поведение, когда пытаетесь освободить пространство, на которое указывает элемент массива, потому что указатель, сохраненный в массиве, не был получен ни от одной из функций распределения.

Предположительно, вы хотели скопировать содержимое строки в выделенное пространство вместо того, чтобы перезаписать указатель на пространство. Для этого вы хотите strcpy().

        arr[idx] = calloc(32, sizeof(char));
        // Note: an error check really ought to be performed here
        strcpy(arr[idx], "sample text");
...