LINUX.ORG.RU

вопрос про память - детский


0

0

Вопрос в следующем.
А что собственно будет если память не освобождать после
скажем выделения malloc()? Если программа заканчивается корректно?

Ну и простой тест:

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

int main()
{
double **arr=NULL;
int i=0,j=0;

arr=(double**)malloc(1000000*sizeof(double));
for(i=0;i<1000000;i++)
arr[i]=(double*)malloc(sizeof(int)*1000000);

printf("\n Array is Allocated.");
for(i=0;i<1000000;i++)
{
for(j=0;j<1000000;j++)
{
arr[i][j]=i*j;
printf("\n %E", arr[i][j]);
}
}

return 0;
}

Почему сегфолтится?
И что будет если запустить ее 1000 раз?

★★★

Полная фигня:

arr=(double**)malloc(1000000*sizeof(double));
for(i=0;i<1000000;i++)
arr[i]=(double*)malloc(sizeof(int)*1000000);

Должно быть как минимум

arr=(double**)malloc(1000000*sizeof(double*));
for(i=0;i<1000000;i++)
arr[i]=(double*)malloc(sizeof(double)*1000000);

svu ★★★★★
()

>не освобождать после скажем выделения malloc()? Если программа заканчивается корректно?


тоже самое если программа заканчивается некорректно. ОС освободит память.


>Почему сегфолтится?


потому что
-arr=(double**)malloc(1000000*sizeof(double));
+arr=(double**)malloc(1000000*sizeof(double*));
...
-arr[i]=(double*)malloc(sizeof(int)*1000000);
+arr[i]=(double*)malloc(sizeof(double)*1000000);

Reset ★★★★★
()

>Почему сегфолтится?

Потому что ерунда написана: вместо malloc(sizeof(int)*1000000) нужно malloc(sizeof(double)*1000000). Это не единственная ошибка, но если исправить эту, то падать, я думаю, перестанет.

>И что будет если запустить ее 1000 раз?

Не уверен, что понимаю вопрос, но при завершении процесса Операционная система освобождает всю его память.

anonymous
()

> arr[i]=(double*)malloc(sizeof(int)*1000000);

размер double не равен размеру int. про память - память в процессе через malloc выделяется не в каком-то глобальном общесистемном пуле а в пространстве процесса, после завершения процесса всё его пространство уничтожается (s/пространство/виртуальное адресное пространство/)

Eshkin_kot ★★
()

спасибо прояснили, тогда зачем все борятся за то чтобы взятую память всегда вернуть?

и еще:
int** p[10];
int** c;

для с мы выделяем память через malloc, а с p работаем как нибудь в духе
p[1]=c-1; и тд

нужно ли в конце вместе с с через free() удалять и p?

vaborg ★★★
() автор топика
Ответ на: комментарий от vaborg

> тогда зачем все борятся за то чтобы взятую память всегда вернуть?

в утилитах, которые отрабатывают раз, типа ls, обычно и не борются..

вообще это очень эффективная техника работы с памятью -- когда какой-то подраздел программы выделяет себе пул памяти, дальше работает с ним без освобождения -- просто как из стэка выделяет, а потом по завершении подраздела весь пул одним махом освобождает.

dilmah ★★★★★
()
Ответ на: комментарий от vaborg

>зачем все борятся за то чтобы взятую память всегда вернуть?

Видимо, чтобы во время выполнения процесса память не расходовалась напрасно.

ftor
()

> arr=(double**)malloc(1000000*sizeof(double));
^^^^^^^^

> for(i=0;i<1000000;i++)
arr[i]=(double*)malloc(sizeof(int)*1000000);
^^^^^^^^^^
Вопрос должен быть -- почему оно иногда таки не segfault'ится?
Тут уже ответили. Добавлю только, что такого рода код лучше
писать вообще без двумерных массивов:

/* gcc -std=c99 -O2 -g */
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
static const size_t N = 10000;
double *arr;

arr = (double*)(malloc(N*N*sizeof(double)));
if (arr == NULL) {
printf("Buy more RAM\n");
return 1;
}
for (size_t i=0; i < N; i++) /* size_t, а не int */
for (size_t j=0; j < N; j++)
arr[i*N + j] = i*j;

for (size_t i=0; i < N; i++)
for (size_t j=0; j < N; j++)
printf("arr[%u][%u] = %e\n", i, j, arr[i*N+j]);

free(arr);
return 0;
}


Dselect ★★★
()
Ответ на: комментарий от vaborg

> нужно ли в конце вместе с с через free() удалять и p?

Скорее не нужно, чем нужно, но хорошо бы увидеть более развернутый пример, потому что написано что-то подозрительное.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.