powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
85 сообщений из 85, показаны все 4 страниц
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38882925
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объявляю массив в цикле, что будет происходить при каждом шаге? Очистится ли уже ненужный и создастся новый буфер ? Не будет ли утечки? Здесь бывают случаи когда буфер может быть не полностью забит, а только какая та его часть.
Код: plaintext
1.
2.
3.
4.
5.
for(int i=0;i<n;i++){
  char buf[MAX_BUF_SIZE];
  recv(sock[i], buf, MAX_BUF_SIZE, 0);
  add_to_ar(ar[i],buf); // этой функции нет. просто показать что с буфером что то выполняется
}
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38882931
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не будет утечки. Память будет выделена в стэке во время компиляции . Буфер будет один.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38882933
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Картежник,

не обнуляется.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38882934
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНе будет утечки. Память будет выделена в стэке во время компиляции . Буфер будет один.
ок значит получается если на втором(len2) этапе цикла будет получено меньше данных чем в первом(len1), то то в массиве после данных второго этапа останутся не затертые данные из первого?
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38882938
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Картежник,

да даже и на первой итерации в буфере будет случайный мусор.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38882945
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Картежник,

1) На каждой итерации цикла вы имеете дело с новым массивом содержащим мусор (содержит ли этот мусор куски предыдущих массивов совершенно не важно - это просто мусор)
2) Утечек никаких нет.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38882948
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КартежникDima TНе будет утечки. Память будет выделена в стэке во время компиляции . Буфер будет один.
ок значит получается если на втором(len2) этапе цикла будет получено меньше данных чем в первом(len1), то то в массиве после данных второго этапа останутся не затертые данные из первого?
Скорее всего так и будет, это на усмотрение компилятора, теоретически он может давать разные куски памяти, но технически ему проще всего давать каждый раз один и тот же кусок.

Кроме того учти что при первом проходе там будет не пусто (нули), а какой-то мусор. Т.к. локальные переменные не инициализируются автоматом.

Формально после каждого прохода массив buf выходит за область его видимости, уничтожается и создается заново в начале следующего прохода.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38882953
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверяется элементарно:
Код: plaintext
1.
2.
3.
4.
5.
for(int i=0;i<n;i++){
  char buf[MAX_BUF_SIZE];
  printf("addr buf in memory %p\n", buf);
  ...
}
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38882988
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПроверяется элементарно:
Вы же понимаете, что если вы постучали в бубен, и после того пошел дождь, то это не значит что каждый раз после бубна будет дождь?
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38883214
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КартежникDima TНе будет утечки. Память будет выделена в стэке во время компиляции . Буфер будет один.
ок значит получается если на втором(len2) этапе цикла будет получено меньше данных чем в первом(len1), то то в массиве после данных второго этапа останутся не затертые данные из первого?

Да. Такое возможно.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38883385
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Картежник,
вам всё правильно сказали (память выделится в стеке, утечки не будет, т.к. массив не инициализирован - в нём мусор. После первой итерации там вполне возможно - и скорее всего - будут "старые данные с предыдущей итерации", но это не гарантируется).

От себя добавлю - вы случайно можете выйти за пределы массива.
Картежник
Код: plaintext
1.
2.
3.
4.
5.
for(int i=0;i<n;i++){
  char buf[MAX_BUF_SIZE];
  recv(sock[i], buf, MAX_BUF_SIZE, 0);
  add_to_ar(ar[i],buf); // этой функции нет. просто показать что с буфером что то выполняется
}


если n окажется больше MAX_BUF_SIZE - 1. Компилятор по этому поводу не ругнётся. Если ограничитесь только чтением, то даже работать почти наверняка будет ( получая "левые" данные). Если попробуете писать (много) - скорее всего скрэшится по доступу к памяти.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38883392
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaОт себя добавлю - вы случайно можете выйти за пределы массива.
если n окажется больше MAX_BUF_SIZE - 1.
А Вас не смущает, что i никогда не применяется к buf, а только к совсем другим массивам?..
То, что размер принятых данных аффтар совершенно игнорирует (очевидно, наивно полагая, что
буфер всегда принимается сразу и полностью) - совсем другой вопрос.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38883472
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaОт себя добавлю - вы случайно можете выйти за пределы массива.

если n окажется больше MAX_BUF_SIZE - 1. Компилятор по этому поводу не ругнётся. Если ограничитесь только чтением, то даже работать почти наверняка будет ( получая "левые" данные). Если попробуете писать (много) - скорее всего скрэшится по доступу к памяти.

Dimitry SibiryakovА Вас не смущает, что i никогда не применяется к buf, а только к совсем другим массивам?..
То, что размер принятых данных аффтар совершенно игнорирует (очевидно, наивно полагая, что
буфер всегда принимается сразу и полностью) - совсем другой вопрос.


вы оба не поняли что за массивы sock и buf,для чего они и т.д. и что n относится к sock, а MAX_BUF_SIZE к buf и они не зависят друг от друга
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38883475
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю решение простое. сам не понял как массив у меня оказался внутри цикла, видимо копипаст
Код: plaintext
1.
2.
3.
4.
5.
6.
int len=0;
char buf[MAX_BUF_SIZE];
for(int i=0;i<n;i++){
  len=recv(sock[i], buf, MAX_BUF_SIZE, 0);//len кол-во полученных символов
  add_to_ar(ar[i],buf,len); // а сюда передадим кол-во(len) символов которые надо использовать из массива buf
}
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38883478
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovА Вас не смущает, что i никогда не применяется к buf, а только к совсем другим массивам?..
То, что размер принятых данных аффтар совершенно игнорирует (очевидно, наивно полагая, что
буфер всегда принимается сразу и полностью) - совсем другой вопрос.

ой извиняюсь, как раз вы все правильно сказали
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38883493
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Картежникдумаю решение простое. сам не понял как массив у меня оказался внутри цикла, видимо копипаст
Код: plaintext
1.
2.
3.
4.
5.
6.
int len=0;
char buf[MAX_BUF_SIZE];
for(int i=0;i<n;i++){
  len=recv(sock[i], buf, MAX_BUF_SIZE, 0);//len кол-во полученных символов
  add_to_ar(ar[i],buf,len); // а сюда передадим кол-во(len) символов которые надо использовать из массива buf
}


а от такого перемещения ничего не меняется.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38883687
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Картежникдумаю решение простое. сам не понял как массив у меня оказался внутри цикла, видимо копипаст
Код: plaintext
1.
2.
3.
4.
5.
6.
int len=0;
char buf[MAX_BUF_SIZE];
for(int i=0;i<n;i++){
  len=recv(sock[i], buf, MAX_BUF_SIZE, 0);//len кол-во полученных символов
  add_to_ar(ar[i], _____________buf__________ , _______len________); // а сюда передадим кол-во(len) символов которые надо использовать из массива buf
}


Ну вот теперь-то len точно может (специально или по недосмотру) превзойти MAX_BUF_SIZE-1. И даже стать отрицательным :).
ЗЫ
Да, в прошлый раз невнимательно посмотрел. Но в любом случае размер приёмника и источника лучше проверять.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38883766
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaКартежникдумаю решение простое. сам не понял как массив у меня оказался внутри цикла, видимо копипаст
Код: plaintext
1.
2.
3.
4.
5.
6.
int len=0;
char buf[MAX_BUF_SIZE];
for(int i=0;i<n;i++){
  len=recv(sock[i], buf, MAX_BUF_SIZE, 0);//len кол-во полученных символов
  add_to_ar(ar[i], _____________buf__________ , _______len________); // а сюда передадим кол-во(len) символов которые надо использовать из массива buf
}


Ну вот теперь-то len точно может (специально или по недосмотру) превзойти MAX_BUF_SIZE-1. И даже стать отрицательным :).
ЗЫ
Да, в прошлый раз невнимательно посмотрел. Но в любом случае размер приёмника и источника лучше проверять.

аха, понял, переделаю так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int len=0,buf_size;
char buf[MAX_BUF_SIZE];
for(int i=0;i<n;i++){
  buf_size=MAX_BUF_SIZE-size_of_ar(i);//здесь size_of_ar(i) возвращает кол-во элементов в ar[i] (без мусора)
  len=recv(sock[i], buf, buf_size, 0);//len кол-во полученных символов
  add_to_ar(ar[i], buf ,len); // а сюда передадим кол-во(len) символов которые надо использовать из массива buf
}
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38883870
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Картежникаха, понял
Нихрена ты не понял. Открой уже справку по recv() и посмотри что он может возвращать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884015
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovКартежникаха, понял
Нихрена ты не понял. Открой уже справку по recv() и посмотри что он может возвращать.

ну я так думаю что recv() возвращает кол-во полученных символов
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884050
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Картежникя так думаю
Думать вредно. Читай доку.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884058
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КартежникDimitry Sibiryakovпропущено...

Нихрена ты не понял. Открой уже справку по recv() и посмотри что он может возвращать.

ну я так думаю что recv() возвращает кол-во полученных символов
он 0 может вернуть и -1, это надо обрабатывать.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884071
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tон 0 может вернуть и -1, это надо обрабатывать.
Более того, он вообще может не вернуть ничего. Если не отключен SIGPIPE ))
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884150
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКартежникпропущено...

ну я так думаю что recv() возвращает кол-во полученных символов
он 0 может вернуть и -1, это надо обрабатывать.
аха это я начал обрабатывать,
0 - значит отключен, делаю disconnect(sock[i]);sock[i]=-1;
-1 - ничего не пришло.
вот если я отключаю клиент после первого send, то на сервер продолжает приходить -1.
если я на сервере буду дисконектить сокет клиента после получения -1, то возможно когда клиент еще не успел выполнить первый send он будет отключен. как узнать когда клиент отключился?
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884165
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Картежниккак узнать когда клиент отключился?
может все-таки послушать советы
Dimitry SibiryakovДумать вредно. Читай доку.

и начать читать как ошибки обрабатывать?
https://www.google.ru/search?q=recv()
https://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx
http://www.opennet.ru/man.shtml?topic=recv&category=2&russian=0
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884575
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объекты объявленные в теле цикла являются автоматическими, это так. И потому они действительно должны автоматически уничтожиться, не вызывая утечек.

Но как это должно наверняка происходить в цикле ? 1. Либо, как говорит Анатолий (возможно это соответствует стандарту), на каждой итерации цикла будет создаваться новый объект, путь даже по тому-же адресу 2. Либо объект будет создан один раз, и уничтожится после завершения всех итераций цикла (о чём говорил Дмитрий, и что логичнее).


Верно ли, что поведение 2 будет гарантировать квалификатор static ? Кстати, в Си и в С++ static несет аналогичное значение ? Мне так не показалось, но видимо что-то не так понял
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884576
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И только ли от стандарта зависит поведение в данном случае ? Т.е. на всех ли компиляторах поведение будет аналогичным ? На всех ли компиляторах поведение должно быть аналогичным ?
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884580
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНо как это должно наверняка происходить в цикле ? 1. Либо, как говорит Анатолий (возможно это соответствует стандарту), на каждой итерации цикла будет создаваться новый объект, путь даже по тому-же адресу 2. Либо объект будет создан один раз, и уничтожится после завершения всех итераций цикла (о чём говорил Дмитрий, и что логичнее).
Компилятор имеет право повторно использовать один физический объект в данном случае, т.к. никаких побочных эффектов создание и удаление не инициализированного массива на стеке не имеет (поведение программы не меняется от этого).

SashaMercuryВерно ли, что поведение 2 будет гарантировать квалификатор static ? Кстати, в Си и в С++ static несет аналогичное значение ? Мне так не показалось, но видимо что-то не так понял
Нет, static это вообще другое, это глобальный объект с локальной областью видимости.
В С++ то же самое.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884583
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Встретил такой пример, у BS

A local variable is initialized when the thread of execution reaches its definition. By default, this happens in every call of the function and each invocation of the function has its own copy of the variable. If a local variable is declared ss t taa t tii c c, a single, statically allocated object will be used to represent that variable in all calls of the function. It will be initialized only the first time the thread of execution reaches its definition. For example:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void f(int a)
{
   while(a--)
   {
       static int n=0;[color=red]//initialize once [/color]
       int x=0;//initialize n times 
   }
}



...

A static variable provides a function with ‘‘a memory’’ without introducing a global variable that might be accessed and corrupted by other functions (see also §10.2.4).
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884607
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВстретил такой пример, у BS ...

Разбери этот код, будет понятнее что такое static
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
int f1()
{
	static int x = 0;
	x += 2;
	return x;
}

int f2()
{
	static int x = 0;
	x += 3;
	return x;
}

void main()
{
	printf("%d %d\n", f1(), f2());
	printf("%d %d\n", f1(), f2());
	printf("%d %d\n", f1(), f2());
	system("pause");
}

...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884611
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКартежниккак узнать когда клиент отключился?
может все-таки послушать советы
Dimitry SibiryakovДумать вредно. Читай доку.

и начать читать как ошибки обрабатывать?
https://www.google.ru/search?q=recv()
https://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx
http://www.opennet.ru/man.shtml?topic=recv&category=2&russian=0
теперь вроде бы работает как надо
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
char buf[MAX_BUF_SIZE];
int max_cur_size=0;
for(int i=0;i<MAX_CLIENTS;i++){
	if(clients[i].sock>=0){ 
		max_cur_size=MAX_BUF_SIZE-clients[i].count;
		int len=recv(clients[i].sock, buf, max_cur_size, 0);		
		if(len==0){
			disconnect_client(i);
			
		}
		else if(len == SOCKET_ERROR && GetLastError( ) != WSAEWOULDBLOCK){
			disconnect_client(i);
			
		}
		else if(len==SOCKET_ERROR){
			
		}
		else{
			for(int j=0;j<len;j++){
				clients[i].buf[j+clients[i].count]=buf[j];
			}
			clients[i].count+=len;
		}
	}
}
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884612
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Картежниктеперь вроде бы работает как надо
Код: plaintext
1.
		else if(len == SOCKET_ERROR && GetLastError( ) != WSAEWOULDBLOCK){



Внимательно читай
https://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError .
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884640
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryОбъекты объявленные в теле цикла являются автоматическими, это так. И потому они действительно должны автоматически уничтожиться, не вызывая утечек.

Цикл тут не при чём. Для объектов, размещённый на стеке, конструктор и деструктор вызываются автоматически, выделение памяти происходит на этапе компиляции (это значит, что если в системе на хватит памяти, исполняемый файл просто не запустится с ошибкой памяти).

SashaMercuryНо как это должно наверняка происходить в цикле ?
SashaMercury, честно говоря, Вы можете это спокойно проверить порядок вызова конструкторов-деструкторов для конкретной единицы компиляции. Написать простенький тест.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#include <iostream>

using namespace std;

class Test{
        public:
         int i;
         Test(){cout << "C\n"; return;}
         ~Test(){cout << "~C\n"; return;}
    };

int main()
{
    for(int i = 0;  ; i++){
        Test t;
        cout << "Old T value is " << t.i << '\n';
        t.i = i;
        cout << "New T value is " << t.i << '\n';
        cout << "============\n";
    }
}


Ещё надёжнее посмотреть ассемблер, но это здесь лишнее. К стати, если убрать строчку t.i = i;, результаты могут решительно поменяться :) В прочем, не столь решительно они всё равно могут поменяться в зависимости от настроек компилятора.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884958
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий, Анатолий, спасибо. Теперь окончательно понял, глобальный объект с локальной областью видимости
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884961
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КартежникОбъявляю массив в цикле, что будет происходить при каждом шаге? Очистится ли уже ненужный и создастся новый буфер ? Не будет ли утечки? Здесь бывают случаи когда буфер может быть не полностью забит, а только какая та его часть.
Код: plaintext
1.
2.
3.
4.
5.
for(int i=0;i<n;i++){
  char buf[MAX_BUF_SIZE];
  recv(sock[i], buf, MAX_BUF_SIZE, 0);
  add_to_ar(ar[i],buf); // этой функции нет. просто показать что с буфером что то выполняется
}



1. в этом цикле, buf автоматический объект ? (считаю что да)
2. Согласно стандарту он должен создавать на каждой итерации, и уничтожаться в конце каждой итерации ? (не знаю)
3. Было бы быстрее если бы объект buf был создан один раз и уничтожен при выходе из цикла ? (считаю что да)
4. Если поведение по пункту 2, то лучше объявить buf с квалификатором static ? (считаю да)
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884976
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryКартежникОбъявляю массив в цикле, что будет происходить при каждом шаге? Очистится ли уже ненужный и создастся новый буфер ? Не будет ли утечки? Здесь бывают случаи когда буфер может быть не полностью забит, а только какая та его часть.
Код: plaintext
1.
2.
3.
4.
5.
for(int i=0;i<n;i++){
  char buf[MAX_BUF_SIZE];
  recv(sock[i], buf, MAX_BUF_SIZE, 0);
  add_to_ar(ar[i],buf); // этой функции нет. просто показать что с буфером что то выполняется
}



1. в этом цикле, buf автоматический объект ? (считаю что да)
2. Согласно стандарту он должен создавать на каждой итерации, и уничтожаться в конце каждой итерации ? (не знаю)
3. Было бы быстрее если бы объект buf был создан один раз и уничтожен при выходе из цикла ? (считаю что да)
4. Если поведение по пункту 2, то лучше объявить buf с квалификатором static ? (считаю да)1. да
2. да
3. да
4. нет, лучше объявить buf перед циклом, статик здесь совершенно ни к чему
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884989
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSashaMercuryпропущено...


1. в этом цикле, buf автоматический объект ? (считаю что да)
2. Согласно стандарту он должен создавать на каждой итерации, и уничтожаться в конце каждой итерации ? (не знаю)
3. Было бы быстрее если бы объект buf был создан один раз и уничтожен при выходе из цикла ? (считаю что да)
4. Если поведение по пункту 2, то лучше объявить buf с квалификатором static ? (считаю да)1. да
2. да
3. да
4. нет, лучше объявить buf перед циклом, статик здесь совершенно ни к чему

egorych, ответ на пункт (3) в данном случае -- НЕТ (в общем случае -- ДА).
Я уверен, ты просто описался.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38884997
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

но если buf объявлен внутри цикла, и мы его не выносим, установка данного объекта в static даст выигрыш по времени ?
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885004
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivegorych, ответ на пункт (3) в данном случае -- НЕТ (в общем случае -- ДА).
Я уверен, ты просто описался.да, MasterZiv, спасибо за поправку.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885005
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему в данном случае ответ на пункт 3 должен быть отрицательным ?
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885008
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryegorych,

но если buf объявлен внутри цикла, и мы его не выносим, установка данного объекта в static даст выигрыш по времени ?

По времени выигрыша не будет, наоборот.
Если массив инициируется, это происходит один раз.
После инициализации массив не деинициализируется (потому что это POD).
Небольшой проигрыш будет при наличии инициализатора из-за проверки, инициализирована ли уже переменная.
Впрочем, я уверен, оптимизирующий компилятор это достаточно хорошо оформит.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885013
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryegorych,

но если buf объявлен внутри цикла, и мы его не выносим, установка данного объекта в static даст выигрыш по времени ?так рассуждая, мы стремительно дойдём до того, что локальные переменные не нужны, и все данные будем хранить только в глобальных объектах )))
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885017
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. мы не будем иметь поведение, которые мы должны иметь согласно стандарту ? Массив не будет создаваться и уничтожаться на каждой итерации цикла ?
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885025
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА почему в данном случае ответ на пункт 3 должен быть отрицательным ?

автор3. Было бы быстрее если бы объект buf был создан один раз и уничтожен при выходе из цикла ? (считаю что да)

В данном случае этот массив-буфер находится в стеке и ни на его создание, ни на его удаление (деинициализацию) не тратится ничего. Стоимость его инициализации -- 0, деинициализации -- тоже 0.
Поэтому место его объявления влияет только на область видимости переменной.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885028
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryно если buf объявлен внутри цикла, и мы его не выносим, установка данного объекта в static даст выигрыш по времени ?
Нет, т.к. для этого в обоих случаях никаких операций не выполняется во время работы программы.

При работе программы не происходит никакого выделения памяти для явно объявленных переменных. Хоть глобальных, хоть локальных. Этим занимается компилятор.

static хуже тем что будет занимать память на протяжении всего времени работы программы и требует инициализации при старте программы.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885029
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryТ.е. мы не будем иметь поведение, которые мы должны иметь согласно стандарту ? Массив не будет создаваться и уничтожаться на каждой итерации цикла ?

Будет. Но выигрыша не будет. Потому что это POD, создание и уничтожение -- пустые операции.

Кроме того (и вообще это самое главное) static и auto имеют важные семантические различия -- время инициализации и жизни и потокобезопасность катастрофически разные, поэтому обычно вопрос заменять одно на другое из-за скорости вообще не стоит --
семантика определяющая.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885062
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня остался один вопрос. Как можно создать и удалить объект за t=0 ? Насчёт удалить понимаю, такой операции видимо даже не будет, просто компилятор не вспомнит что по этому адресу что-то расположено. Но как он может выделить память за нулевое время, не понимаю.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885127
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryУ меня остался один вопрос. Как можно создать и удалить объект за t=0 ? Насчёт удалить понимаю, такой операции видимо даже не будет, просто компилятор не вспомнит что по этому адресу что-то расположено. Но как он может выделить память за нулевое время, не понимаю.
так можно и скорость света превысить

Оно нулевое там где ты смотришь, но выделение памяти все-таки происходит, но при старте программы: выделяется один большой кусок под все переменные, он называется стэк.
В стэке компилятор распределяет место под хранение содержимого переменных. "Область видимости" определяет когда занята конкретная ячейка в стэке. Т.е. просто компилятор отслеживает чтобы место занятое переменной не использовалось другими переменными пока она в области видимости. В эти моменты выделение/освобождение памяти не происходит, при объявлении переменной вообще ничего не происходит во время выполнения.

Запусти в релизе
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
void main()
{
	int a;
	a = 1;
	printf("a %p\n", &a);
	{
		int b;
		b = 2;
		printf("b %p\n", &b);
	} // область видимости b закончилась
	{
		int c;
		printf("c %p c=%d\n", &c, c);
	}
	system("pause");
}


у меня такой результатa 0012FF74
b 0012FF78
c 0012FF78 c=2

т.е. место где хранилась b стало ненужным и это же место использовано под c
а т.к. я забыл инициализировать с, то там оказалось то что было в b
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885144
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отличный пример. Спасибо :)
1. Стек ограничен ?(думаю да)
2. Происходит ли проверка во время раздачи адресов объектам ? Просим мы адрес на буфер из 1000 целых, хранитель стека мне даст любой адрес, или проверит, есть ли в стеке столько памяти ? Вероятно проверит
3. Раздача этих адресов происходит во время выполнения, или во время компиляции ? Видимо во время компиляции. Тогда всё понятно.

Верно ?
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885148
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима, у меня вот что

SS test rel outa 003DFA68
b 003DFA64
c 003DFA64 c=2


странно что отскочил назад, а у тебя вперёд
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885158
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryстранно что отскочил назад, а у тебя вперёд
Некоторые компиляторы размещают переменные в памяти в порядке обратном их объявлению. Некоторые вообще произвольно. Так что вы на порядок не рассчитывайте.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885184
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня уже гонят..
Спасибо, сегодня я узнал много нового, а самое главное интересного C:
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885287
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryОтличный пример. Спасибо :)
1. Стек ограничен ?(думаю да)
2. Происходит ли проверка во время раздачи адресов объектам ? Просим мы адрес на буфер из 1000 целых, хранитель стека мне даст любой адрес, или проверит, есть ли в стеке столько памяти ? Вероятно проверит
3. Раздача этих адресов происходит во время выполнения, или во время компиляции ? Видимо во время компиляции. Тогда всё понятно.

Верно ?
1. Размер стэка задается в параметрах вызова компилятора.
2,3. Я компиляторов не писал, только в общих чертах представляю как они устроены, поэтому далее могу ошибаться. Выше рассматривали использование стэка внутри функций, но есть еще один нерассмотренный момент - вызов функций. Происходит примерно следующее: во время компиляции определяется сколько места в стэке надо для работы функции, а при ее вызове ей это место дается (память не выделяется, просто дается следующий свободный кусок требуемого размера). В какой-то момент стэк закончится и будет обращение по адресу за пределами стэка. Например при рекурсии невозможно определить во время компиляции сколько раз функция вызовет сама себя.
Но при компиляции функции адреса хранения переменных постоянные, просто они задаются относительно начала того самого блока памяти выделенного в стэке перед вызовом функции. По сути адрес состоит из двух частей: адреса начала блока и смещения.
Хочешь более глубокого изучения этой темы - это надо ассемблер изучать.

Пример как в рекурсии выйти за пределы стэка
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void f(int x)
{
	x++;
	printf("%p %d\n", &x, x);
	f(x);
}

void main()
{
	f(0);
}

...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885368
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,
Ты бы всё же книжки читал, а не по форумам шастал. Форум хорошо, когда что-то не понял и застрял.
А изучать что-то по форумам невозможно.

SashaMercuryУ меня остался один вопрос. Как можно создать и удалить объект за t=0 ? Насчёт удалить понимаю, такой операции видимо даже не будет, просто компилятор не вспомнит что по этому адресу что-то расположено. Но как он может выделить память за нулевое время, не понимаю.

Ну, изучи как стек работает.

На самом деле там действительно ноль.

Есть sp (вершина стека), она при входе в функцию увеличивается (или уменьшается) на размер всех переменных в функции,
и далее у каждой переменной адрес -- это вершина стека + смещение к переменной ( определяется в процессе компиляции ).

А дальше весь код работы с переменной просто работает со своим куском памяти так, как надо.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885484
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

не упрощай :)
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885538
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
нет у меня времени изучать больше книг в этом году. Мне нравится Си и кажется интересным С++, это я изучаю. Возникают смежные вопросы. Нет времени не потому что лень, а потому что именно в этом году у меня 6-8 часов в день математика.

Сейчас изучаю Кнута, и BS. Заканчиваю изучать Анализ программного кода. Когда закончу одну из трёх, начну Таненбаума. Правда нет времени, не ругайтесь.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885718
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСейчас изучаю Кнута, и BS. Заканчиваю изучать Анализ программного кода. Когда закончу одну из трёх, начну Таненбаума. Правда нет времени, не ругайтесь.

Вот Кнута брось. Можешь вообще выкинуть книгу.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885720
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВот Кнута брось. Можешь вообще выкинуть книгу.
Он же математик. Ему Кнут - самое то.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38885805
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНет времени не потому что лень, а потому что именно в этом году у меня 6-8 часов в день математика.

Сейчас изучаю Кнута, и BS.
В какой конторе у бакалавров 6-8 часов ежедневно математика? Просто любопытно. Обычно у баков всего не более трёх пар в день.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38886708
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivSSСейчас изучаю Кнута, и BS. Заканчиваю изучать Анализ программного кода. Когда закончу одну из трёх, начну Таненбаума. Правда нет времени, не ругайтесь.

Вот Кнута брось. Можешь вообще выкинуть книгу.

Я уверен, вы просто описались
PS Это ведь не Донцова или Фленов
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38887119
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryMasterZivпропущено...


Вот Кнута брось. Можешь вообще выкинуть книгу.

Я уверен, вы просто описались
PS Это ведь не Донцова или Фленов
Возможно я озвучу некое среднее мнение среди модераторов. Обсуждение Кнута
без линии С/С++ мы будем считать оффтопом в этом форуме.

Безусловно старина Дональд умный и интересный автор. Но линия обсуждения
должна быть актуальной и интересной для сообщества. Разводить блоги или
дискурсы на математиков 9000 левела мы считаем предметом сторонним и не имеющем
отношения к клиент-серверным технологиям.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38887648
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyMasterZivВот Кнута брось. Можешь вообще выкинуть книгу.
Он же математик. Ему Кнут - самое то.

Да если он ещё Кнута читать будет, то это -- всё, до пенсии.
Кнут -- удивительная зануда, удивительный крючкотвор и буквоед.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38887652
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryMasterZivпропущено...


Вот Кнута брось. Можешь вообще выкинуть книгу.

Я уверен, вы просто описались
PS Это ведь не Донцова или Фленов


Нет, я не описался. Я тебе категорически не рекомендую читать Кнута без нужды (в смысле -- если там какой-то алгоритм нужный описан, и его нигде больше нет). И никому не рекомендую. Полно на эту же тему (алгоритмы) других толковых, но более лёгких книжек.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38887659
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivДа если он ещё Кнута читать будет, то это -- всё, до пенсии.
Я так понял что программистом он не собирается быть.
А чисто для общего развития можно читать что угодно ))
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #38888926
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКартежниккак узнать когда клиент отключился?
может все-таки послушать советы
Dimitry SibiryakovДумать вредно. Читай доку.

и начать читать как ошибки обрабатывать?
https://www.google.ru/search?q=recv()
https://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx
http://www.opennet.ru/man.shtml?topic=recv&category=2&russian=0

Я прошу прошения , не знаю кто писал эту доку
но ИМХО лучше сразу делать правильно
через SO_ERROR, errno, strerror(errno)
Например :
Код: plaintext
1.
2.
3.
4.
  if (getsockopt(soc, SOL_SOCKET, SO_ERROR, (void*)(&valopt), &lon) < 0) { 
                 fprintf(stderr, "Socket errror %d -[%s]\n", errno, strerror(errno)); 
                 exit(0); 
              } 
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291386
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyКартежник,

1) На каждой итерации цикла вы имеете дело с новым массивом содержащим мусор (содержит ли этот мусор куски предыдущих массивов совершенно не важно - это просто мусор)
2) Утечек никаких нет.
А если бы у него было так:
Код: plaintext
1.
2.
3.
4.
5.
smth_class* name;
for(int i=0;i<n;i++){
  name = new smth_class(i);
}
delete name;


При этом реализация класса нам неизвестна. Насколько вообще законна такая конструкция и будет ли утечка памяти?
PS Я полагаю что это плохой участок кода, но хотел бы уточнить. Здесь вероятно правильней проводить реинициализацию без использования new, один раз перед for выполнить создание объекта и его его инициализацию, на итерациях обновлять значения объекта
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291399
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один преподаватель рассказывал такую историю: когда он был студентом, другой студент задавал на лекция всякие глупые вопросы. Первого это раздражало. А потом он понял, что эти глупые вопросы были, на самом деле, важны.
В формате лекции (полтора часа пары) это действительно и важно и нужно - время ограничено.
В формате форума - вредно и раздражает: предполагается, что человек не придумал какую-то фигню только что, а всё же потратил своё время на самостоятельные разборки.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291401
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вангую Сашка скоро возненавидит С++. Ему-бы MathLab или Wolfram для душевной услады...
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291408
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Чтобы ломать кирпичи - нужно тренироваться, тренироваться и что? Правильно - ещё раз тренироваться" (ц) неизвестный сержант ВДВ
new выделяет память и вызывает конструктор для создания объекта в выделенной памяти.
delete вызывает деструктор для разрушения объекта и освобождает занятую объекту память.
Таким образом, new и delete вызываются строго попарно и в одинаковой форме.
Вроде, об этом рассказывается во первых строках главы про new любой книжки по C++
Зуб не дам, но и в стандарте такие вещи должны быть упомянуты. Хотя, вероятно, в стандарте всё будет "размазано" по куче взаимосвязанных мест.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291418
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может у него С++ с GC
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291421
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А были-ли проекты С++ компиллятора с таким аллокатором?
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291423
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Умные указатели?
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291426
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не то. Это требует переписывания кода. А имею в виду вот так чтоб ты флудил через new
а при выходе из scope блока или функции - утечки удалялись.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291429
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonимею в виду вот так чтоб ты флудил через new а при выходе из scope блока или функции -
утечки удалялись.

Будет забавно, когда память, выделенная в malloc, освободится при выходе из него.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291434
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже если опустить "мелкую проблемку" отсутствия эффективного алгоритма поиска "мёртвых" объектов, остаётся суровая проблема порядка вызова деструкторов.
try/finally тоже руками пишут. И переписывают, если выяснится, что накосячили.
Т.е. не существует общего рабочего решения, не говоря уж об эффективном - какая уж тут сборка мусора.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291443
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovmaytonимею в виду вот так чтоб ты флудил через new а при выходе из scope блока или функции -
утечки удалялись.

Будет забавно, когда память, выделенная в malloc, освободится при выходе из него.

Стековая тоже освобождается. Забавно.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291463
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovВ формате форума - вредно и раздражает: предполагается, что человек не придумал какую-то фигню только что, а всё же потратил своё время на самостоятельные разборки.

В формате Сообщества - советы такого рода я приму только от Анатолия, Дмитрия и наших администраторов. А если это не совет мне, то не занимайтесь оффтопом
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291464
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я полагал, что существуют такие реализации класса, что такой код не приводил бы к утечке памяти.
Код: plaintext
1.
2.
3.
4.
5.
smth_class* name;
for(int i=0;i<n;i++){
  name = new smth_class(i);
}
delete name;
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291465
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВангую Сашка скоро возненавидит С++. Ему-бы MathLab или Wolfram для душевной услады...

Знаю MATLAB, Maple и немного R. Численные методы на них удобнее всего реализовать. Эти языки проблемно-ориентированы к таким задачам. Кроме R - он скорее ориентирован на решение задач из области статистики.
Но больше всего нравится Си. Он самый красивый
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291470
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА были-ли проекты С++ компиллятора с таким аллокатором?
http://www.hboehm.info/gc/
Баян, классика.
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291472
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЯ полагал, что существуют такие реализации класса, что такой код не приводил бы к утечке
памяти.

У тебя в этом коде прямо прописано использование dumb pointer, так что оставь надежды.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291502
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЯ полагал, что существуют такие реализации класса, что такой код не приводил бы к утечке памяти.
Код: plaintext
1.
2.
3.
4.
5.
smth_class* name;
for(int i=0;i<n;i++){
  name = new smth_class(i);
}
delete name;


Существуют реализации указателей. smth_class* замени на std::unique_ptr<smth_class> и утечки не будет. Еще почитай про shared_ptr и weak_ptr
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291505
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tsmth_class* замени на std::unique_ptr<smth_class> и утечки не будет

Только вот компилироваться перестанет. У него нет оператора присваивания простого
указателя и конструктор из указателя - explicit.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291696
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDimitry Sibiryakovпропущено...

Будет забавно, когда память, выделенная в malloc, освободится при выходе из него.

Стековая тоже освобождается. Забавно.в каком смысле? SP сдвигается, никаких операций с "памятью" не производится. В общем смысле, её никто и не держал, чтоб освобождать :)
...
Рейтинг: 0 / 0
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
    #39291922
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbв каком смысле? SP сдвигается, никаких операций с "памятью" не производится. В общем смысле, её никто и не держал, чтоб освобождать :)
А в куче как-то по-другому происходит? )))
...
Рейтинг: 0 / 0
85 сообщений из 85, показаны все 4 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]