bubu ([info]bubu) rakstīja [info]koderi kopienā,
Ko es parasti daru - kautkādā common.h failā, kuru visur, inklūdēju ierakstu šādas rindas:
#ifdef _DEBUG
    #include <crtdbg.h>
    #define new new(_CLIENT_BLOCK, __FILE__, __LINE__)
#endif
Tas garantēs to, ka visi mani new izsaukumi tajā crtdbg bibliotēkā reģistrēsies ar tipu CLIENT_BLOCK (nevis NORMAL_BLOCK) un tas darbosies tikai Debug konfigurācijā. Attiecīgi tajā outputā, ko tu rādi, tiks drukāts aptuveni sekojošais:
main.cpp(11): {1866} client block at 0x00F8D8C0, 12 bytes long 
Data: L 4C D1 F8 00 00 00 00 00 00 D7 F8 00 
(uzsvars ir uz "client block")
Var viegli redzēt gan, ka tas ir tavs memory leaks (client block), gan arī kurā vietā (main.cpp faila 11. rindā). Ar dubultklikški uz šīs rindas IDE automātiski kursoru noliks norādītajā vietā (main.cpp faila 11. rindā).

Papildus tam, izmantojot crtdbg.h funkcijas var uzrakstīt filtru, kas izfiltrēs nost tos normal blokus. Pēc manas saprašanas tie parasti rodās visādos STL un citās bibliotēkās singletonos. Cik man liekās, tad šis Vizuālās studijas memory leaku detektors, izejot no programmas, nostrādā pirms globālu objektu destruktoriem. Tad nu tajā pašā STL'ā ir singletoni, kuri atmiņu atbrīvo tikai destruktoros. Mani personīgi tāda atmiņa neinteresē, tāpēc es ignorēju šos normal blokus. Lietoju filtru, kurš man rāda tikai client blokus un neskatos uz tiem normal blokiem.

Vienīgais mīnuss manam paņēmienam ir tāds, ka tas memory leakus uzrādīs tikai tavis kompilētājiem new (vai ar nelielu papildus kodu - arī malloc) izsaukumiem. Tas nerādīs kautkādus memoryleakus citu API izmantotajos resursos (atmiņai/failiem/bildēm/soketiem/utt).


(Lasīt komentārus)

Nopūsties:

No:
Lietotājvārds:
Parole:
Ievadi te 'qws' (liidzeklis pret spambotiem):
Temats:
Tematā HTML ir aizliegts
  
Ziņa:

Gandrīz jau aizmirsu pateikt – šis lietotājs ir ieslēdzis IP adrešu noglabāšanu. Operatore Nr. 65.
Neesi iežurnalējies. Iežurnalēties?