Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2016, 21:26   #1
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию Код работает, но сжирает всю доступную память

Программа в режиме реального времени отображает скорость и трафик на сетевых картах. В каком месте идёт утечка?
Код:
private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) {
			 //получение текущей даты и времени в реальном режиме
				 SYSTEMTIME currentdate;
				 GetSystemTime(&currentdate);
				 String ^datanow=Convert::ToString(currentdate.wDay)+"."+Convert::ToString(currentdate.wMonth)+"."+Convert::ToString(currentdate.wYear);
				 String ^vremyanow=Convert::ToString(currentdate.wHour+4)+":"+Convert::ToString(currentdate.wMinute)+":"+Convert::ToString(currentdate.wSecond);
				label9->Text=datanow+" , "+vremyanow;
			//получение скоростей сетевых адаптеров				
				 time1=GetTickCount();
				 MIB_IF_TABLE2 *pIfTable2;
				 MIB_IF_ROW2 *pIfRow2;
				 pIfTable2=(MIB_IF_TABLE2*) MALLOC(sizeof(MIB_IF_TABLE2));
				 if (pIfTable2==NULL) listBox2->Items->Add("Ошибка при выделении памяти под GetIfTable2!");
				 //инициализация GetIfTable2Ex чтобы получить размер dwSize
				 dwSize=sizeof(MIB_IF_TABLE2);

				 if (GetIfTable2Ex(MibIfTableNormal,&pIfTable2)==ERROR_NOT_ENOUGH_MEMORY)
					 {
						 FREE(pIfTable2);
						 pIfTable2=(MIB_IF_TABLE2*) MALLOC(dwSize);
						 if (pIfTable2==NULL)	 listBox2->Items->Add("Ошибка выделения памяти MIB_IF_TABLE2");
				 }
					 //второй вызов GetIfTable2Ex который должен завершиться без ошибок
				 	 if (GetIfTable2Ex(MibIfTableNormal,&pIfTable2)==NO_ERROR) 
						 {
							 if (pIfTable2->NumEntries>0)
							 {
								pIfRow2=(MIB_IF_ROW2*) MALLOC(sizeof(MIB_IF_ROW2));
								if (pIfRow2==NULL)
								{
									listBox2->Items->Add("Ошибка выделения памяти MIB_IF_ROW2");
									if (pIfRow2!=NULL)
									{
										FREE(pIfTable2);
										pIfTable2=NULL;
									}
								}
							 }
					   }
					 else 
						 {
							 oshibka=GetLastError();
							 listBox2->Items->Add("Ошибка при вызове функции GetIfTable2Ex: "+oshibka.ToString());
					     }
					 //перебираем все записи в таблице
					 for (i=0;i<(int)pIfTable2->NumEntries;i++)
					 {
						 pIfRow2->InterfaceIndex=pIfTable2->Table[i].InterfaceIndex;
						 SecureZeroMemory((PVOID)pIfRow2, sizeof(MIB_IF_ROW2));
			pIfRow2->InterfaceLuid = pIfTable2->Table[i].InterfaceLuid;
			if ((dwRetVal = GetIfEntry2(pIfRow2)) == NO_ERROR)
			{
				if ((pIfRow2->Alias != NULL) && (pIfRow2->Type == IF_TYPE_ETHERNET_CSMACD) && (pIfRow2->PhysicalMediumType == NdisPhysicalMedium802_3) && (pIfRow2->OperStatus == IfOperStatusUp) && (pIfRow2->InterfaceAndOperStatusFlags.HardwareInterface == 1))
				{
					double down1=Convert::ToDouble((pIfRow2->InOctets)/1024.0/1024.0);
					double up1=Convert::ToDouble((pIfRow2->OutOctets)/1024.0/1024.0);
					//интерфейс маршрутизатора NETGEAR WNR3500L
					if (pIfRow2->InterfaceIndex==router1number)
					{
					label16->Text= msclr::interop::marshal_as<String^>(pIfRow2->Alias);
					label22->Text= msclr::interop::marshal_as<String^>(pIfRow2->Description);
					label11->Text="Down: " + (pIfRow2->InOctets / 1024/1024).ToString() + " МБ";
					label12->Text="Up: " + (pIfRow2->OutOctets / 1024/1024).ToString() + " МБ";
					if (counter>0)
							{
								if (time1==time2) time1=time1+1;
								label18->Text=("DownSpeed: "+(((pIfRow2->InOctets-download1)/(time1-time2)).ToString()));
							    label19->Text=("UpSpeed: "+(((pIfRow2->OutOctets-upload1)/(time1-time2)).ToString()));
							}
							download1=pIfRow2->InOctets;
							upload1=pIfRow2->OutOctets;
							time2=GetTickCount();
							counter++;
					}
					//интерфейс маршрутизатора TP-LINK TL-1043ND
					if (pIfRow2->InterfaceIndex==router2number)
					{
					label17->Text= msclr::interop::marshal_as<String^>(pIfRow2->Alias);
					label23->Text= msclr::interop::marshal_as<String^>(pIfRow2->Description);
					label14->Text="Down: " + (pIfRow2->InOctets / 1024/1024).ToString() + " МБ";
					label15->Text="Up: " + (pIfRow2->OutOctets / 1024/1024).ToString() + " МБ";
					if (counter>0)
							{
								if (time1==time2) time1=time1+1;
								label20->Text=("DownSpeed: "+(((pIfRow2->InOctets-download2)/(time1-time2)).ToString()));
							    label21->Text=("UpSpeed: "+(((pIfRow2->OutOctets-upload2)/(time1-time2)).ToString()));
							}
							download2=pIfRow2->InOctets;
							upload2=pIfRow2->OutOctets;
							time2=GetTickCount();
							counter++;
					}

				}
		
			 }
	}
			}
calypso вне форума Ответить с цитированием
Старый 11.03.2016, 21:47   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

У вас слишком длинный и страшный код. Не уверено, что кто-то захочет в нем копаться.
А так на вскидку у вас MALLOC 3 штуки, а FREE только 2 штуки.
С учётом того что эти строчки выполняются только в случае ошибки.
Код:
									if (pIfRow2!=NULL)
									{
										FREE(pIfTable2);
										pIfTable2=NULL;
									}
То можно сказать что утечка заключается в отсутствии освобождении памяти.
Всю память которую вы выделяете надо освобождать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 11.03.2016, 23:17   #3
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

А глобальной функции нет, чтобы всё очистить после каждого цикла таймера? По сути дела ведь он например каждые 10 мс обновляется, старые то данные уже никому не нужны.
calypso вне форума Ответить с цитированием
Старый 11.03.2016, 23:48   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

С/С++ не будет за вами подтирать.
что взяли то обратно и положите.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.03.2016, 02:27   #5
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Короче добавление
Код:
FREE(pIfTable2);
	 FREE(pIfRow2);
ничего не дает, ни после MALLOC, ни в конце обработчика Timer.
Пробовал ещё удалять
Код:
SecureZeroMemory((PVOID)pIfRow2, sizeof(MIB_IF_ROW2));
, без неё все работает. Но память как жрал, так и продолжает жрать. Расход примерно 1-2 МБ в секунду.
calypso вне форума Ответить с цитированием
Старый 12.03.2016, 11:46   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Вас не настораживает, что GetIfTable2Ex НЕ требует указать размер буфера?
Гляньте в документацию, насчет того, что делать с буфером, когда он больше не нужен.

Последний раз редактировалось waleri; 12.03.2016 в 11:50.
waleri вне форума Ответить с цитированием
Старый 12.03.2016, 15:38   #7
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Добавил
Код:
FreeMibTable(pIfTable2);
	FreeMibTable(pIfRow2);
в конце обработчика Timer1 , ничего не изменилось.
calypso вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как узнать работает ли добавленная память Андрей1973 Компьютерное железо 19 07.03.2014 08:33
Дискретная математика!Минимизация!Требуется подмога или направление на полезную,доступную информацию! LinaDota Помощь студентам 1 09.01.2013 08:35
Программа использует всю память. Анатоль Общие вопросы по Java, Java SE, Kotlin 0 14.02.2012 17:05
как использовать всю возможную память?? arturkhusnull Операционные системы общие вопросы 3 23.03.2011 10:07
Система не видит всю память Arigato Компьютерное железо 22 18.03.2009 14:11