Nevede se mi prijit na to v cem je chyba... Jednak bych rad vedel jak obecne resit tyhle chyby, treba kompilator pise neco o F12 pro dalsi info, ale to se me nejak nedari zapnout.
A konkretne je chyba v tomto kodu :
mojeTrida * trida = new mojeTrida[3]();
for (int i=0; i<=2; i++)
trida[i].Load(fileName);
delete [] trida;
Neni to cely, ale prijde me, ze v tomhle muze byt ten problem. Jestli to chapu dobre tak po zavolani delete [] trida se nejdriv volaji destruktory a az vsechny probehnou teprve se provadi delete? Chyba ale nastane po ukonceni druheho destruktoru.
jednak té třídě chybí definice funkcí, volání instančních proměných se takto nedělá, musíš odkázat na ptr třídy a z něho potom na proměnnou, nikde nevidím deklaraci "size" a "GHND", vytvoření pole třídy je špatně, volání load() na třídě není možný páč třída v poli neexistuje
#3Scrat
v tom případě nechápu co po nás chceš... si měl pastnout validní kód, když tvrdíš že to je funkční, o tom úryvku se to rozhodně říct nedá.. ptal ses na chybu, takže...
nechápu jak myslíš "lovit chyby", prostě to vypíše chyby nebo ne, většinou jsou i smysluplný a podle nich to vyřešíš
psal si něco o F12, ale vůbec nenapíšeš co to vypsalo
Pokud chceš poradit, tak sem máš napsat podrobnější informace a hlavně validní.. možná proto ti nikdo dlouho neodpovídal ;)
#4ingiraxo
Tak nechtel jsem posilat dlouhej kod, kterej nekdo musi procitat... slo me o to jestli v ramci toho co jsem poslal neni nejaka blbost co se alokovani a dealokovani pameti tyce, vzhledem k tomu, ze chyba je corruption of the heap.
Jasne, pokud kompilator hodi nejakou chybu tak to vetsinou vyresim, ale on to skompiluje, ale nasledne pri spusteni, kdyz dojde na ten delete [] tridy hodi hlasku (asi mazu co bych nemel nebo tak neco). Konkretne se zastavi v souboru "dbgheap.c" ve funkci "extern "C" _CRTIMP int __cdecl _CrtIsValidHeapPointer(const void * pUserData)".
Na tu F12 co to pise, jsem se spis ptal co s tim, protoze jsem si po stisku niceho nevsimnul.
To loveni chyb, jsem mel na mysli, ze mas treba hodne kodu funkci, trid atd. a ted jak najit ktera cast chybne alokuje/dealokuje pamet, kdyz se chyba projevi treba az nekde uplne jinde.
#5Scrat
znovu opakuju.. v tom co si poslal je chyba snad na každým řádku a pokud si to vykopíroval, tak ti to nemůže fungovat nikdy
// pokud se jedna o pole, tak na konci nesmí být ()
mojeTrida * trida = new mojeTrida[3]();
// ok, ale spis bych pouzi i < 3
for (int i=0; i<=2; i++)
// spatne hned ze 2 duvodu 1) pole je prazdný, 2) pole obsahuje pointery
trida[i].Load(fileName);
// by mělo být ok (zavola destruktory jednotlivých trid), ale v tomhle pripde bych pro jistotu zavolal delete i pro jednotlivy prvky
delete [] trida;
Pro analýzu kódu má třeba VisualStudio Ultimate tools, kterej ti projde kód a pocita vyskyty jednotlivých volání a snad i vyuzití paměti (zjištování mem leaků) ofc. existujou i další app, ale názvy si nepamatuju, protože je nepoužívám
Nejlepší řešení pro zkoumání chyb je debug, kolikrát ti i řekne proč to padá než koukat na kód a zjištovat jestli je to v cajku
// pokud se jedna o pole, tak na konci nesmí být ()
//RE: je to pole, ale v ramci debugu to opravdu zavola defaultni konstruktor a vytvori tridu (a vyjde to nastejno jestli tam je ta prazdna zavorka nebo ne)
mojeTrida * trida = new mojeTrida[3]();
// ok, ale spis bych pouzi i < 3
//RE: to jo
for (int i=0; i<=2; i++)
// spatne hned ze 2 duvodu 1) pole je prazdný, 2) pole obsahuje pointery
//RE: kazdopadne to vytvori/prepise 3 instance tridy, ktere vypadaji v pohode
trida[i].Load(fileName);
// by mělo být ok (zavola destruktory jednotlivých trid), ale v tomhle pripde bych pro jistotu zavolal delete i pro jednotlivy prvky
//RE: jako delete pro kazdy index extra?
delete [] trida;
#7Scrat
Tak uz vim cim to bylo, v originale mam pocet trid v poli zapsan promenou a ta byla o 1 index mensi nez pocet co se zapisoval v cyklu. Po VBA kde se indexuje pole pomoci maximalniho indexu, si nejak nemuzu na indexovanim poctem prvku zvyknout.