Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла? / 25 сообщений из 85, страница 1 из 4
18.02.2015, 14:46
    #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
18.02.2015, 14:49
    #38882931
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
Не будет утечки. Память будет выделена в стэке во время компиляции . Буфер будет один.
...
Рейтинг: 0 / 0
18.02.2015, 14:50
    #38882933
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
Картежник,

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

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

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

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

Формально после каждого прохода массив buf выходит за область его видимости, уничтожается и создается заново в начале следующего прохода.
...
Рейтинг: 0 / 0
18.02.2015, 15:03
    #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
18.02.2015, 15:25
    #38882988
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
Dima TПроверяется элементарно:
Вы же понимаете, что если вы постучали в бубен, и после того пошел дождь, то это не значит что каждый раз после бубна будет дождь?
...
Рейтинг: 0 / 0
18.02.2015, 17:52
    #38883214
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
КартежникDima TНе будет утечки. Память будет выделена в стэке во время компиляции . Буфер будет один.
ок значит получается если на втором(len2) этапе цикла будет получено меньше данных чем в первом(len1), то то в массиве после данных второго этапа останутся не затертые данные из первого?

Да. Такое возможно.
...
Рейтинг: 0 / 0
18.02.2015, 22:34
    #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
18.02.2015, 22:54
    #38883392
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
BagaBagaОт себя добавлю - вы случайно можете выйти за пределы массива.
если n окажется больше MAX_BUF_SIZE - 1.
А Вас не смущает, что i никогда не применяется к buf, а только к совсем другим массивам?..
То, что размер принятых данных аффтар совершенно игнорирует (очевидно, наивно полагая, что
буфер всегда принимается сразу и полностью) - совсем другой вопрос.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.02.2015, 06:13
    #38883472
Картежник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
BagaBagaОт себя добавлю - вы случайно можете выйти за пределы массива.

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

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


вы оба не поняли что за массивы sock и buf,для чего они и т.д. и что n относится к sock, а MAX_BUF_SIZE к buf и они не зависят друг от друга
...
Рейтинг: 0 / 0
19.02.2015, 06:22
    #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
19.02.2015, 06:29
    #38883478
Картежник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
Dimitry SibiryakovА Вас не смущает, что i никогда не применяется к buf, а только к совсем другим массивам?..
То, что размер принятых данных аффтар совершенно игнорирует (очевидно, наивно полагая, что
буфер всегда принимается сразу и полностью) - совсем другой вопрос.

ой извиняюсь, как раз вы все правильно сказали
...
Рейтинг: 0 / 0
19.02.2015, 07:27
    #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
19.02.2015, 11:22
    #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
19.02.2015, 12:07
    #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
19.02.2015, 13:00
    #38883870
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
Картежникаха, понял
Нихрена ты не понял. Открой уже справку по recv() и посмотри что он может возвращать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.02.2015, 14:47
    #38884015
Картежник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?
Dimitry SibiryakovКартежникаха, понял
Нихрена ты не понял. Открой уже справку по recv() и посмотри что он может возвращать.

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

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

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

ну я так думаю что recv() возвращает кол-во полученных символов
он 0 может вернуть и -1, это надо обрабатывать.
аха это я начал обрабатывать,
0 - значит отключен, делаю disconnect(sock[i]);sock[i]=-1;
-1 - ничего не пришло.
вот если я отключаю клиент после первого send, то на сервер продолжает приходить -1.
если я на сервере буду дисконектить сокет клиента после получения -1, то возможно когда клиент еще не успел выполнить первый send он будет отключен. как узнать когда клиент отключился?
...
Рейтинг: 0 / 0
19.02.2015, 16:09
    #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
Форумы / C++ [игнор отключен] [закрыт для гостей] / очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла? / 25 сообщений из 85, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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