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.
Příspěvky odeslané z IP adresy 85.70.218.–
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;
}