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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2019, 15:24   #1
Артём_2
Пользователь
 
Регистрация: 17.09.2013
Сообщений: 39
Печаль Как найти утечку памяти?

Вот код:
Код:
//---------------------------------------------------------------------------

#include <System.hpp>
#pragma hdrstop
#include "Main.h"
#include "Functions.h"
#include "Thread1.h"
#include "Thread2.h"
#include <System.JSON.hpp>
#include <memory>
#pragma package(smart_init)
extern bool stop;
extern String nowfamily,access_token,nowid;
extern int never;

__fastcall Potok1::Potok1(bool CreateSuspended, String _url, int _type, int _id, String _post)
	: TThread(CreateSuspended)
{
	this->url = _url;
	this->type = _type;
	this->id = _id;
	this->post = _post;
}
//---------------------------------------------------------------------------
void __fastcall Potok1::Execute()
{
	int prohod = 0;
	String response = "";
	TStringList * Ids = new TStringList;
	Ids->Clear();
	restart:
	TIdHTTP *HTTP = new TIdHTTP(NULL);
	if (HTTP) {
		try {

			//HTTP->ProxyParams->ProxyServer = "127.0.0.1";
			//HTTP->ProxyParams->ProxyPort = 8888;

			HTTP->ConnectTimeout = 15000;
			if (HTTP->Connected()) HTTP->Disconnect();
			String url_enc = HTTP->URL->URLEncode(url);
			if(type==2){
				TStringStream *post_list = new TStringStream();
				String postone = HTTP->URL->ParamsEncode(post);
				post_list->WriteString(postone);
				post_list->Position = 0;
				response = HTTP->Post(url_enc,post_list);
				delete post_list;
			} else {
				response = HTTP->Get(url_enc);
			}
		}
		catch(EIdSocketError &E)  // Исключения сокетов
		{
			sleep(10000);
			goto restart;
		}
		catch(EIdHTTPProtocolException &E)
		{
			response = E.ErrorMessage;
		}
		catch(EIdException &E)// Другие исключения Indy
		{
			sleep(10000);
			goto restart;
		}
		catch(Exception &E)   // Другие НЕ Indy искключения
		{
			sleep(10000);
			goto restart;
		}
		try {HTTP->Socket->Close();}
		catch (...) {HTTP->Disconnect();}
		delete HTTP;
		HTTP = NULL;
	}
		//////// Получение текущей фамилии
	if(type==0){
		std::auto_ptr<TJSONObject>jObj_group_99(static_cast<TJSONObject*>(TJSONObject::ParseJSONValue(response)));
		if(jObj_group_99->Get("response")==NULL){
			ShowMessage(L"Токен верный?");
		}
		TJSONArray *jArr_group_98 = static_cast<TJSONArray*>(jObj_group_99->Get("response")->JsonValue);
		TJSONObject *jObj_group_97 = static_cast<TJSONObject*>(TJSONObject::ParseJSONValue(jArr_group_98->Items[0]->ToString()));
		nowfamily = jObj_group_97->Get("last_name")->JsonValue->Value();
		//delete static_cast<TJSONObject*>(jObj_group_97);
		//delete static_cast<TJSONArray*>(jArr_group_98);
		String url = "https://api.vk.com/method/friends.get?user_id="+Form1->Memo1->Lines->Strings[id]+"&count=5000&v=5.92&access_token="+access_token;
		Potok1 *Potok0 = new Potok1( false, url,1,id,"");
		Potok0->FreeOnTerminate = false;
		Potok0->WaitFor();
		delete Potok0;
		//////  Загрузка друзей
	} else if(type==1){
		std::auto_ptr<TJSONObject>jObj_group_1(static_cast<TJSONObject*>(TJSONObject::ParseJSONValue(response)));
		if(jObj_group_1->Get("response")!=NULL){
			TJSONObject *jObj_group_2 = static_cast<TJSONObject*>(jObj_group_1->Get("response")->JsonValue);
			TJSONArray *jArr_group_3 = static_cast<TJSONArray*>(jObj_group_2->Get("items")->JsonValue);
			for (int i2 = 0; i2 < jArr_group_3->Count; i2++) {
				Ids->Add(jArr_group_3->Items[i2]->ToString());
			}
			if((jArr_group_3->Count>4000)&&(prohod==0)){
				url = "https://api.vk.com/method/friends.get?user_id="+Form1->Memo1->Lines->Strings[id]+"&offset=5000&count=5000&v=5.92&access_token="+access_token;
				prohod = 1;
				goto restart;
			}
		}
		for (int i4 = 0; i4 < Ids->Count; i4=i4+1000) {
			String idsline = "";
			for (int i5 = 0; i5 < 1000; i5++) {
				int tempi = i5+i4;
				if (Ids->Count > tempi) {
					if (i5==0) {	idsline = Ids->Strings[tempi]; }
					else{	idsline = idsline+","+Ids->Strings[tempi]; }
				}
			}

			String url = "https://api.vk.com/method/users.get?v=5.92&fields=relation,relatives&access_token=" + access_token;
			String post = "user_ids="+idsline;
			Potok1 *Potok2 = new Potok1( false, url,2,id,post);
			Potok2->FreeOnTerminate = false;
			Potok2->WaitFor();
			delete Potok2;
			sleep(StrToInt(Form1->Edit2->Text));
		}
		if(never==0){
			memadd = nowid;
			Synchronize(&Memo7Add);
		}
	} else if(type==2){
		response = StringReplace(response, "\\\\", "", TReplaceFlags()<< rfReplaceAll << rfIgnoreCase);
		response = StringReplace(response, "\\\"", "", TReplaceFlags()<< rfReplaceAll << rfIgnoreCase);
		std::auto_ptr<TJSONObject>jObj_group_7(static_cast<TJSONObject*>(TJSONObject::ParseJSONValue(response)));
		TJSONArray *jArr_group_8 = static_cast<TJSONArray*>(jObj_group_7->Get("response")->JsonValue);
		for (int i6 = 0; i6 < jArr_group_8->Count; i6++) {
			TJSONObject *jObj_group_9 = static_cast<TJSONObject*>(TJSONObject::ParseJSONValue(jArr_group_8->Items[i6]->ToString()));
			//////// Поиск партнёра ////////
			if(jObj_group_9->Get("relation_partner")!=NULL){
				TJSONObject *jObj_group_10 = static_cast<TJSONObject*>(jObj_group_9->Get("relation_partner")->JsonValue);
				if(jObj_group_10!=NULL){
					String partid = jObj_group_10->Get("id")->JsonValue->Value();
					if(partid==nowid){
						memadd = jObj_group_9->Get("id")->JsonValue->Value();
						Synchronize(&Memo2Add);
						never++;
					}
				}
			}
			//////// Поиск родных /////////
			if(jObj_group_9->Get("relatives")!=NULL){
				TJSONArray *jArr_group_11 = static_cast<TJSONArray*>(jObj_group_9->Get("relatives")->JsonValue);
				for (int i7 = 0; i7 < jArr_group_11->Count; i7++) {
					TJSONObject *jObj_group_12 = static_cast<TJSONObject*>(TJSONObject::ParseJSONValue(jArr_group_11->Items[i7]->ToString()));
					//// Родители
					if(jObj_group_12->Get("type")->JsonValue->Value()=="parent"){
						if(jObj_group_12->Get("id")!=NULL){
							String parentid = jObj_group_12->Get("id")->JsonValue->Value();
							parentid = StringReplace(parentid, "-", "", TReplaceFlags()<< rfReplaceAll << rfIgnoreCase);
							if(parentid==nowid){
								memadd = jObj_group_9->Get("id")->JsonValue->Value();
								Synchronize(&Memo3Add);
								never++;
							}
						}
					}
					//// Братья - Сёстры
					if(jObj_group_12->Get("type")->JsonValue->Value()=="sibling"){
						if(jObj_group_12->Get("id")!=NULL){
							String siblingid = jObj_group_12->Get("id")->JsonValue->Value();
							siblingid = StringReplace(siblingid, "-", "", TReplaceFlags()<< rfReplaceAll << rfIgnoreCase);
							if(siblingid==nowid){
								memadd = jObj_group_9->Get("id")->JsonValue->Value();
								Synchronize(&Memo4Add);
								never++;
							}
						}
					}
					//// Дети
					if(jObj_group_12->Get("type")->JsonValue->Value()=="child"){
						if(jObj_group_12->Get("id")!=NULL){
							String childid = jObj_group_12->Get("id")->JsonValue->Value();
							childid = StringReplace(childid, "-", "", TReplaceFlags()<< rfReplaceAll << rfIgnoreCase);
							if(childid==nowid){
								memadd = jObj_group_9->Get("id")->JsonValue->Value();
								Synchronize(&Memo5Add);
								never++;
							}
						}
					}
				}
			}
			/////// Поиск по фамилии
			String fam = jObj_group_9->Get("last_name")->JsonValue->Value();
			if(FamilyRez(fam)==FamilyRez(nowfamily)){
				if(Form1->Memo2->Lines->IndexOf(jObj_group_9->Get("id")->JsonValue->Value())!=-1) goto skiip1;
				if(Form1->Memo3->Lines->IndexOf(jObj_group_9->Get("id")->JsonValue->Value())!=-1) goto skiip1;
				if(Form1->Memo4->Lines->IndexOf(jObj_group_9->Get("id")->JsonValue->Value())!=-1) goto skiip1;
				if(Form1->Memo5->Lines->IndexOf(jObj_group_9->Get("id")->JsonValue->Value())!=-1) goto skiip1;
				never++;
				memadd = jObj_group_9->Get("id")->JsonValue->Value();
				Synchronize(&Memo6Add);
				skiip1:
			}
		}
	}
	delete Ids;
}
}

Где то я сделал не правильно тк за 4 мин работы программа съедает больше 100мб оперативной памяти=(
Артём_2 вне форума Ответить с цитированием
Старый 17.01.2019, 16:19   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Не используйте auto_ptr. Где объявления Potok1? Если это наследник от TThread? то где ваша реакция на терминейт?
p51x вне форума Ответить с цитированием
Старый 17.01.2019, 16:30   #3
Артём_2
Пользователь
 
Регистрация: 17.09.2013
Сообщений: 39
По умолчанию

После удаления auto_ptr программа стала сьедать за 4мин 200мб вместо 120мб


Код:
for (; i < Form1->Memo1->Lines->Count; i++) {
		nowid = Form1->Memo1->Lines->Strings[i];
		Form1->StatusBar1->Panels->Items[1]->Text = Form1->Memo1->Lines->Strings[i];
		if(stop==true){
			ShowMessage(L"СТОП");
			return;
		}
		Form1->ProgressBar1->Max = Form1->Memo1->Lines->Count;
		Form1->ProgressBar1->Position = i+1;
		never = 0;
		String urlfam = "https://api.vk.com/method/users.get?user_ids="+Form1->Memo1->Lines->Strings[i]+"&v=5.92&access_token=" + access_token;
		Potok1 *Potok0 = new Potok1( false, urlfam,0,i,"");
		Potok0->FreeOnTerminate = false;
		Potok0->WaitFor();
		delete Potok0;

	}

Последний раз редактировалось Артём_2; 17.01.2019 в 16:40. Причина: Коментарий
Артём_2 вне форума Ответить с цитированием
Старый 17.01.2019, 17:13   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

У вас какая версия?
В современном С++ есть shared_ptr, unique_ptr.

Ну а во многих случаях просто надо знать основы С++ (RAII, ...) и выкинуть new/delete.
Например
Код:
TStringList ids;
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.01.2019, 17:15   #5
Артём_2
Пользователь
 
Регистрация: 17.09.2013
Сообщений: 39
По умолчанию

radstudio 10,2

Можно ли пример?


Так же при написании
Код:
TStringList ids;
получаю ошибку:
[bcc32 Error] Thread1.cpp(29): E2459 Delphi style classes must be constructed using operator new

Последний раз редактировалось Артём_2; 17.01.2019 в 17:18. Причина: Ошибка
Артём_2 вне форума Ответить с цитированием
Старый 17.01.2019, 17:51   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Артём_2 Посмотреть сообщение
E2459 Delphi style classes must be constructed using operator new
А, точно, этожбилдер.
Тогда наверно unique_ptr проще всего для таких случаев если в Билдере не изобрели что-то еще.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.01.2019, 18:00   #7
Артём_2
Пользователь
 
Регистрация: 17.09.2013
Сообщений: 39
По умолчанию

Заменил все auto_ptr на unique_ptr. Все равно съедает 120мб
Артём_2 вне форума Ответить с цитированием
Старый 17.01.2019, 20:03   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Артём_2 Посмотреть сообщение
Как найти утечку памяти?
https://docs.microsoft.com/en-us/vis...y?view=vs-2017
waleri вне форума Ответить с цитированием
Старый 17.01.2019, 20:07   #9
Артём_2
Пользователь
 
Регистрация: 17.09.2013
Сообщений: 39
По умолчанию

Это будет работать в radstudio?
Артём_2 вне форума Ответить с цитированием
Старый 17.01.2019, 20:22   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

О, виноват, не доглядел...
Не знаю, но хочется верить, что и там есть что-то подобное из коробки.
Но в целом, не используйте new/delete вручную - используйте unique_ptr или shared_ptr.
waleri вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[РЕШЕНО] Устранить утечку памяти в приложении javascript staircaseMaker Фриланс 5 06.07.2018 19:30
Помогите найти утечку памяти Adult_Master JavaScript, Ajax 3 08.08.2016 23:20
Помогите найти утечку garuna Общие вопросы Delphi 4 14.01.2016 05:56
Задача-найти объем оперативной памяти по шестнадцатеричному адресу последнего байта оперативной памяти Ksana Alex Помощь студентам 4 14.11.2013 15:51