powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
25 сообщений из 85, страница 1 из 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
25 сообщений из 85, страница 1 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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