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


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