Hogyan érzékeli memóriavesztés
A fejlesztés a nagy alkalmazások, hogy működnek a nagy mennyiségű információ az első helyen van egy probléma, amikor hibakeresés kimutatására helytelen memória kiosztás. A probléma lényege az, hogy ha már kiosztott lefoglalni, majd megjelent nem minden a kiválasztott kötet, a formáció a memória blokkok rá van írva, vállalkozók, de valójában nem használják őket. Huzamosabb ideig tartó működés a program, mint például blokkok felhalmozódnak, ami jelentős memória-felhasználás.
Hogyan érzékeli memóriavesztés
A fejlesztés a nagy alkalmazások, hogy működnek a nagy mennyiségű információ az első helyen van egy probléma, amikor hibakeresés kimutatására helytelen memória kiosztás. A probléma lényege az, hogy ha már kiosztott lefoglalni, majd megjelent nem minden a kiválasztott kötet, a formáció a memória blokkok rá van írva, vállalkozók, de valójában nem használják őket. Huzamosabb ideig tartó működés a program, mint például blokkok felhalmozódnak, ami jelentős memória-felhasználás.
Ahhoz, hogy felismerik az ilyen hibák létrehozott speciális szoftver (BoundsChecker típusú Numega), de gyakrabban ez sokkal kényelmesebb, hogy létrejöjjön egy mechanizmus szivárgások a saját projekteket. Ezért a módszer legyen egyszerű, és ugyanabban az időben, mint egy sokoldalú, mint lehetséges. Továbbá, nem akarja átírni az évek felhalmozott megabájt írt kód és hibakeresése hosszú, mielőtt eszembe jutott, hogy megvédjék magukat a hibákat. Tehát hozzáadjuk a követelmények listáját, a szabványosítás, azaz meg kell valamilyen módon, hogy bele elleni védelem hibák a szabványos kódot.
A javasolt megoldás alapja a túlterhelés standard memóriafoglalási szereplők új és törölni. És mi túlterheli a globális szereplők új | törölni, mert átírni ezeket a nyilatkozatokat az egyes osztályokra korábban kidolgozott lenne nagyon időigényes folyamat. így után tankolás csak akkor tudunk kell nyomon követni a memória kiosztás, és ezért annak felszabadítása idején a program befejezése. Minden eltérést - hiba.
végrehajtás
A projekt írt Visual C ++, de tegye bele másik dialektusát C ++ nem lesz túl nehéz. Először is, meg kell felülírni a standard piaci új és törölni úgy, hogy működik minden projekt esetében. Ezért stdafx.h hozzá a következő részlet:
Mint látható, van egy felülbíráló szereplői blokk # IFDEF / # endif. Védi kódex hatása a kibocsátás alatt álló program össze. Lehet, hogy észrevette, hogy most az új üzemeltető három lehetősége van egy helyett. Két további paraméterek közé tartozik a fájlnév és a sor száma, ahol memóriát. Ez hasznos az adott helyen, ahol a hiba jelentkezik. Azonban a projekt kódja is utal, hogy az üzemeltető új, tart egy paramétert. Ennek kijavításához eltérést kell adni a következő részletben
Most minden új szereplők fogják hívni a három paraméter elpárologtató fogja helyettesíteni a hiányzó paramétereket. Természetesen üres felülírt funkció semmiben nem segít, ezért adjunk nekik egy kis kód:
Hogy teljes legyen a kép, amire szükség van, hogy felülbírálja szereplők új [] és a delete [], de nem volt szignifikáns különbségeket nem - hozzon létre!
Az utolsó érintés - AddTrack write () és RemoveTrack (). STL fogja használni szabványos eszközök listáját szeretné létrehozni a használt memória blokkok:
Befejezése előtt a program, mi allocList lista hivatkozásokat tartalmaz memória blokkok kotoroye nem szabadították fel. Mindössze annyit kell tennie -, hogy ez az információ valahol. A projektünk, felsoroljuk a kiadatlan memória területek a kimeneti ablakban hibakeresés Visual C ++ hozzászólás:
Remélhetőleg ez a projekt, hogy a bug-listák rövidebb, és a fenntarthatósági program. Sok szerencsét!
#include
#include
using namespace std;
#ifndef _ALLOC_
#define _ALLOC_
typedef struct DWORD címe;
DWORD méret;
char fájl [64];
DWORD sor;
> ALLOC_INFO;
typedef lista
AllocList * allocList;
#endif
void AddTrack (DWORD addr, DWORD asize, const char * fname, DWORD lnum)
ALLOC_INFO * info;
if (allocList!) allocList = new (AllocList);
>
info = new (ALLOC_INFO);
info-> cím = addr;
strncpy (info-> fájl, fname, 63);
info-> vonal = lnum;
info-> size = asize;
allocList-> insert (allocList-> begin (), * info);
>;
void RemoveTrack (DWORD addr)
AllocList :: bejáró i;
if (! allocList)
return;
for (i = allocList-> kezdődik () ;! i = allocList-> vége (); i ++)
if ((i) -> cím == addr)
allocList-> Erase (i);
break;
>
>
>;
érvényteleníti DumpUnfreed ()
AllocList :: bejáró i;
DWORD totalSize = 0;
char buf [1024];
for (i = allocList-> kezdődik () ;! i = allocList-> vége (); i ++)
sprintf (buf, "% -50s: \ tLINE \ tADDRESS unfreed ..."
(I) -> fájl (i) -> sort, (i) -> cím, (i) -> méretű);
OutputDebugString (buf);
totalSize + = (i) -> méretet;
>
sprintf (buf „--------------------------------------------- ----- „);
OutputDebugString (buf);
sprintf (buf "Total Unfreed: bájt." totalSize);
OutputDebugString (buf);
>;
//.
inline void * __cdecl szereplő új (unsigned int mérete, const char * file, int vonal)
void * ptr = (void *) malloc (méret);
AddTrack ((DWORD) PTR, méretét, a fájl, vonal);
vissza (ptr);
>;
inline void __cdecl üzemeltető törli (void * p)
RemoveTrack ((DWORD) p);
szabad (p);
>;
#ifdef _DEBUG
#define DEBUG_NEW új (__ FILE__, __LINE__)
#else
#define DEBUG_NEW új
#endif
#define új DEBUG_NEW
megváltozott:
Kezelése típusú (* i) -> címet I-> címet;
allocList-> eltávolítása ((* i)); on allocList-> Erase (i); mert A lista elérésekor a remove () a string if (* _First == _Val) lehetetlen összehasonlítani a szerkezet és fordító vyrugivaetsya
#ifndef
#define
#endif nem segít, hiszen lehetővé teszi?