Memmory leak – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Memmory leak – C / C++ – Fórum – Programujte.comMemmory leak – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Jakub
~ Anonymní uživatel
865 příspěvků
30. 3. 2013   #1
-
0
-

Ahoj, celý den řeším ve svém programu memmory leaky a je to docela bída. Řeším přiklad realizace třídy která má za pomocí metody Add, přidávat do pole ukazatelů nové hodnoty typu PERSON(STRING JMENo, STRING PRIJMENI, STRING ADR, STRING ADR). Přidávání funguje jako javovská implementace SortedSetu(HASH,TREE), tzn pokud existuje prvek nepřidá ho, pokud neexistuje přidáho na správnou pozici aby pole zustalo seřazené, jde tedy o množinu. Pro zjištění pozice používá logarytmické vyhledávání BinnarySearch.

Problém nastal v tom že při každém přidání v případě že je nutno prvky posunout (tedy se vkládá do prostřed pole nebo na začátek) nastane Memmory Leak, pokud se vkládá na konec pole memmory leak nenastane. Nemůžu zaboha přijít kde se to tam bere. Je to určitě způsobeno manipulací v poli s pointerama ale nevím čímto.

BinnarySearch vrací hodnotu možné pozice ve tvaru (-možnápozice -1) aby se odlišila nulová pozice. Tedy pokud vkládám do prostřed pole vytvořím si z tohoto tvaru přímý tvar a poté zkopíruji všechny prvky odzadu ( na konci pole čeká volné místo, konstruktor definuje locArr - index prvního volného místa vždy na nulu, tedy locArr ukazuje vždy na první volné místo).

Vše jsem si hezky nakreslil a nikde mi žádná pamět neuniká, nevím čím to je, prosím vás o pomoc :-) Moc děkuji

bool Add ( const string & oName, const string & oAddr, const string & cName, const string & cAddr ){
		Person * p = new Person(oName,oAddr,cName,cAddr);

		int possibleIndex;
		possibleIndex = binarySearch(*p);
		int index = -(possibleIndex+1);
		if(possibleIndex>=0){return false;}
		else{
			reallocate();

			for(int a=locArr; a>=index+1; a--){
				if(a-1==index){
					
					Person * pom = new Person(**(arrayList+a-1));
					
					arrayList[a]=pom;
					
				}else{
					arrayList[a]=arrayList[a-1];}
			}
			delete arrayList[index];
			arrayList[index] = p;




		}locArr++;


		return true;
	}

Ještě konstruktory třídy person pro úplnost

public:
	Person(const string Pname, const string Padress, const string Cname, const string Cadress){
		this->Padress=Padress;
		this->Pname=Pname;
		this->Cname=Cname;
		this->Cadress=Cadress;
	}
	Person(){
		this->Pname="";
		this->Padress="";
		this->Cname="";
		this->Cadress="";
	}
	Person(Person & p){
		this->Pname=p.Pname;
		this->Padress=p.Padress;
		this->Cname = p.Cname;
		this->Cadress= p.Cadress;
	}
Nahlásit jako SPAM
IP: 85.70.218.–
Reklama
Reklama
KIIV+42
God of flame
30. 3. 2013   #2
-
0
-

pokud mas linux, tak pouzij valgrind s trasovanim, kde se alokovala pamet, ktera unikla...  tusim --track-origin

samozrejme zkompilovat s -g3 aby to melo podrobnosti o tom kodu

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jakub
~ Anonymní uživatel
865 příspěvků
30. 3. 2013   #3
-
0
-

Ahoj, nemam linux, mam Visual Studio a to nevím jestli umí trasovat memmory leaky, každopádně je umí detekovat, a jsou určitě v této metodě protože pokud jí nespustím tak memmory leak nenastane, navíc nenastane ani když se Xkrat alokuje a pořád vkládá na konec, takže ani případ že by funkce reallocate fungovala špatně je hloupost :-/ A jinak myslím že Visual Studio kompiluje rovnou s G3, ale k memory leaku píše pouze stručné info. Ještě mě napadá jestli nemůže být memmoryy leak v Binnary Search ale tam žádné pointery nepoužívám, pouze si zastoupím ArrayList novým pointerem, nic víc.

Nahlásit jako SPAM
IP: 85.70.218.–
KIIV+42
God of flame
30. 3. 2013   #4
-
0
-

no v prve rade se zase tak moc nestava, ze by byla chyba v kompilatoru... program proste dela vzdy to co naprogramujes...  a kdyz to dela jen, kdyz to davas na zacatek, tak zacni vypisovat pointery co se kde alokovalo a co se kde uvolnilo... sice to bude docela narocny, ale kdyz toho nebude moc, zvladnes to i takhle rucne odladit

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
zlz
~ Anonymní uživatel
634 příspěvků
30. 3. 2013   #5
-
+1
-
Zajímavé

   

for (...) {
    arrayList[a] = arrayList[a-1];
}
arrayList[index] = p;
Nahlásit jako SPAM
IP: 78.156.159.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 177 hostů

Podobná vlákna

Memory leak — založil Duin

Memory leak — založil CommanderZ

.NET Memory leak — založil RomanZ

Windows Service memory leak — založil hlucheucho

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý