Corruption of the heap – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Corruption of the heap – C / C++ – Fórum – Programujte.comCorruption of the heap – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Scrat0
Návštěvník
10. 11. 2014   #1
-
0
-

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;

mojeTrida

class mojeTrida
  {
  private:
    HANDLE handle;
    DWORD * dw;
  };

int mojeTrida::Load(LPWSTR soubor)
{
  handle=GlobalAlloc(GHND, size);
  dw = (DWORD *)GlobalLock(handle);
};

mojeTrida::~mojeTrida()
{
  GlobalUnlock(handle);
  GlobalFree(handle);
};

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.

Nahlásit jako SPAM
IP: 88.100.129.–
ingiraxo+15
Grafoman
10. 11. 2014   #2
-
0
-

#1 Scrat
noo ve skutečnosti je to celý špatně :)

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

zkus to napsat znovu a lépe

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Scrat0
Návštěvník
10. 11. 2014   #3
-
0
-

#2 ingiraxo
Pisu ze to neni cely... nechal jsem jen casti ve kterych je snad problem, jinak kod jde skompilovat a je funkci.

A slo me i o obecnou rovninu, jak napriklad v Microsoftim Visual ++ 2010 Express lovit podobne chyby.

Nahlásit jako SPAM
IP: 88.100.129.–
ingiraxo+15
Grafoman
10. 11. 2014   #4
-
0
-

#3 Scrat
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 ;)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Scrat0
Návštěvník
10. 11. 2014   #5
-
0
-

#4 ingiraxo
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.

Nahlásit jako SPAM
IP: 88.100.129.–
ingiraxo+15
Grafoman
10. 11. 2014   #6
-
0
-

#5 Scrat
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

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Scrat0
Návštěvník
10. 11. 2014   #7
-
0
-

#6 ingiraxo 

// 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;
Nahlásit jako SPAM
IP: 88.100.129.–
Scrat0
Návštěvník
10. 11. 2014   #8
-
0
-

#7 Scrat
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.

Diky za pomoc.

Nahlásit jako SPAM
IP: 88.100.129.–
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, 45 hostů

Moderátoři diskuze

 

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