Память не освобождается.
От: needle  
Дата: 16.05.05 08:46
Оценка:
#include <stdio.h>

struct cs {
cs *next;
char *buffer ;
cs () { buffer = new char [1024]; }
~cs() { delete buffer; }
};

int main(){
cs *a,*first;
getchar();
for (int i=0; i<5000; i++) {
if (i==0) first=new cs;
else { a = new cs; a->next = first; first = a; }
}
getchar();
while (a) {
first = a->next;
delete a;
a = first;
}
getchar();
return 0;
}

по идее ведь второй цикл должен освободить все что занял первый, в чем дело?
Re: Память не освобождается.
От: CrystaX Россия https://crystax.me/
Дата: 16.05.05 08:49
Оценка:
Здравствуйте, needle, Вы писали:

N>#include <stdio.h>

N>struct cs {
N>   cs *next;
N>   char *buffer ;
N>   cs () {  buffer = new char [1024];  }
N>   ~cs() { delete [] buffer; }
N>};

N>int main(){
N>cs *a,*first;
N>getchar();
N>for (int i=0; i<5000; i++) {
N>if (i==0) first=new cs;
N>else { a = new cs; a->next = first; first = a; }
N>} 
N>getchar();
N>while (a) {
N>first = a->next;
N>delete a;
N>a = first;
N>} 
N>getchar();
N>return 0;
N>}


N>по идее ведь второй цикл должен освободить все что занял первый, в чем дело?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re: Память не освобождается.
От: Glоbus Украина  
Дата: 16.05.05 08:53
Оценка:
Здравствуйте, needle, Вы писали:

N>#include <stdio.h>


N>struct cs {

N> cs *next;
N> char *buffer ;
N> cs () { buffer = new char [1024]; }
N> ~cs() { delete buffer; }
N>};

N>int main(){

N>cs *a,*first;
N>getchar();
N>for (int i=0; i<5000; i++) {
N>if (i==0) first=new cs;
N>else { a = new cs; a->next = first; first = a; }
N>}
N>getchar();
N>while (a) {
N>first = a->next;
N>delete a;
N>a = first;
N>}
N>getchar();
N>return 0;
N>}

N>по идее ведь второй цикл должен освободить все что занял первый, в чем дело?


а почему ты решил что он не освобождает
Удачи тебе, браток!
Re[2]: Память не освобождается.
От: needle  
Дата: 16.05.05 09:07
Оценка: :)
N>>по идее ведь второй цикл должен освободить все что занял первый, в чем дело?

G>а почему ты решил что он не освобождает


Да потому что прогоняю первый цикл, процесс съел до 8мб, а второй ничего не освободил.
Но что странно, если процедуру повторить, то все равно 8мб будет.
Re[2]: Память не освобождается.
От: needle  
Дата: 16.05.05 09:10
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Здравствуйте, needle, Вы писали:


CX>
N>>#include <stdio.h>

N>>struct cs {
N>>   cs *next;
N>>   char *buffer ;
N>>   cs () {  buffer = new char [1024];  }
N>>   ~cs() { delete [] buffer; }
N>>};

N>>int main(){
N>>cs *a,*first;
N>>getchar();
N>>for (int i=0; i<5000; i++) {
N>>if (i==0) first=new cs;
N>>else { a = new cs; a->next = first; first = a; }
N>>} 
N>>getchar();
N>>while (a) {
N>>first = a->next;
N>>delete a;
N>>a = first;
N>>} 
N>>getchar();
N>>return 0;
N>>}
CX>


N>>по идее ведь второй цикл должен освободить все что занял первый, в чем дело?


результат тот же
Re[3]: Память не освобождается.
От: ilejn Россия  
Дата: 16.05.05 09:12
Оценка:
Здравствуйте, needle, Вы писали:



N>Да потому что прогоняю первый цикл, процесс съел до 8мб, а второй ничего не освободил.

N>Но что странно, если процедуру повторить, то все равно 8мб будет.

Сишный runtime не возвращает операционной системе освободившуюся память.
Вот и все странности.
Re[4]: Память не освобождается.
От: needle  
Дата: 16.05.05 09:18
Оценка:
Здравствуйте, ilejn, Вы писали:

I>Здравствуйте, needle, Вы писали:




N>>Да потому что прогоняю первый цикл, процесс съел до 8мб, а второй ничего не освободил.

N>>Но что странно, если процедуру повторить, то все равно 8мб будет.

I>Сишный runtime не возвращает операционной системе освободившуюся память.

I>Вот и все странности.

а тогда как поэлементно очистить память от того что создается в первом цикле?
Re[5]: Память не освобождается.
От: Вадим Никулин Россия Здесь
Дата: 16.05.05 09:29
Оценка:
Здравствуйте, needle, Вы писали:

I>>Сишный runtime не возвращает операционной системе освободившуюся память.

I>>Вот и все странности.

N>а тогда как поэлементно очистить память от того что создается в первом цикле?


Тебе сказали — память очищена. То, что runtime-библиотека не освободила память — ее дело. Можешь написать свой менеджер памяти, в нем пользуй напрямую методы выделения памяти операционной системы.
А теперь — главный вопрос: зачем тебе это надо? Тебя сильно напрягают 8MB? Я думаю, операционка сама разрулит эту ситуацию, например, неиспользиемые страницы может засвопить.
Re[3]: Память не освобождается.
От: CrystaX Россия https://crystax.me/
Дата: 16.05.05 09:37
Оценка:
Здравствуйте, needle, Вы писали:

[skipped]

N>результат тот же


Результат, может, и тот же, но по стандарту память, выделенную с помощью new [], освобождать нужно с помощью delete [] и никак иначе.
По поводу же результата тебе уже объяснили ниже.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[5]: Память не освобождается.
От: ilejn Россия  
Дата: 16.05.05 09:43
Оценка:
Здравствуйте, needle, Вы писали:


N>а тогда как поэлементно очистить память от того что создается в первом цикле?


Небольшое дополнение к сказанному.

Проблема (точнее говоря, некий эффект) никак не связана со спецификой приведенного примера.
Можно сделать один malloc, потом free, и убедиться, что память (скорее всего) операционной системе не вернули.

Если желание поуправлять размером адресного пространства процесса преодолеть не удается,
то ответ лежит в районе mallopt или чего-нибудь специфичного для используемого менеджера памяти.

Если еще глубже, то brk и sbrk, но это уже не Posix и
эти функции не предназначены для использования широкими народными массами.
Re[6]: Память не освобождается.
От: needle  
Дата: 16.05.05 10:21
Оценка:
Здравствуйте, ilejn, Вы писали:

I>Здравствуйте, needle, Вы писали:



N>>а тогда как поэлементно очистить память от того что создается в первом цикле?


I>Небольшое дополнение к сказанному.


I>Проблема (точнее говоря, некий эффект) никак не связана со спецификой приведенного примера.

I>Можно сделать один malloc, потом free, и убедиться, что память (скорее всего) операционной системе не вернули.

I>Если желание поуправлять размером адресного пространства процесса преодолеть не удается,

I>то ответ лежит в районе mallopt или чего-нибудь специфичного для используемого менеджера памяти.

I>Если еще глубже, то brk и sbrk, но это уже не Posix и

I>эти функции не предназначены для использования широкими народными массами.

Ну чтож, спасибо всем, желание поуправлять преодолел, не хочу настолько углубляться )
Re: Память не освобождается.
От: Ally235 Россия  
Дата: 16.05.05 10:23
Оценка: +1
Здравствуйте, needle, Вы писали:

N>#include <stdio.h>


...
N>for (int i=0; i<5000; i++) {
N>if (i==0) first=new cs;
N>else { a = new cs; a->next = first; first = a; }
...
for (int i=0; i<5000; i++) {
if (i==0){first=new cs; first->next = NULL; }
else { a = new cs; a->next = first; first = a; }
всё есть брахман
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.