Avatar billede rrm Nybegynder
14. august 2006 - 10:42 Der er 13 kommentarer og
1 løsning

Få vist memory leaks i visual studio

Hejsa..

Jeg har fundet et tips på nettet (http://www.litwindow.com/Knowhow/wxHowto/wxhowto.html#precompiled), der gør at visual studio fortæller hvis der er et memory leak, men jeg kan ikke lige få det til at virke (projektet er et dll projekt).

Jeg har tilføjet i min precompiled header:
#ifdef _DEBUG
    #include <crtdbg.h>
    #define DEBUG_NEW new(_NORMAL_BLOCK ,__FILE__, __LINE__)
#else
    #define DEBUG_NEW new
#endif

og i c++ filen umildbart efter import delen
if defined(_DEBUG)
    #define new DEBUG_NEW
#endif
_DEBUG er defineret...

Jeg laver så testen:
T* ttt = new T;
ttt = NULL;

Skulle dette så ikke generer en memory leak eller har jeg misforstået noget??? Er der andre måder at opnå ønskede information??
Avatar billede brilleaben Nybegynder
14. august 2006 - 12:25 #1
Hvis det er managed code burde det ikke blive set som en memory leak - check dine projekt settings.
Avatar billede bertelbrander Praktikant
14. august 2006 - 19:59 #2
Du mangler måske et kald til _CrtDumpMemoryLeaks?

Managed er ikke C++
Avatar billede rrm Nybegynder
19. august 2006 - 12:42 #3
jep, det var det jeg manglede, tak for det...

Jeg har lagt _CrtDumpMemoryLeaks(); i DllMain som følgende:
#if defined(_DEBUG)
    ofstream logFile(LOG_FILE.c_str(), ios::out);

    #define new DEBUG_NEW

    BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, PVOID fImpLoad)
    {
        if(fdwReason == DLL_PROCESS_DETACH)
            _CrtDumpMemoryLeaks();

        return(TRUE);
    }
#endif

Er det en god måde eller findes der bedre???
Avatar billede bertelbrander Praktikant
19. august 2006 - 14:04 #4
Det ser fornuftigt ud, men jeg har ikke prøvet _CrtDumpMemoryLeaks med DLL'er så...
På den anden side; hvis det virker, så er det en god måde.
Avatar billede rrm Nybegynder
19. august 2006 - 14:35 #5
ok, lige en anden ting, jeg får en masse leaks ved at have nestet const string ala

const string t = "jkhj";
const string f = "jkhkghfd" + t + "fshdf"

Kan man lave en sådan opbygning uden at t ikke bliver friet igen??
Grunden er at jeg har lavet en url parse via et regular udtryk, der opbygget på denne måde for at få et overblik over strukturen...
Avatar billede bertelbrander Praktikant
19. august 2006 - 17:18 #6
Der er ikke noget i ovenstående der burde kunne give leak.
De eneste leaks burde være dem der kommer fra new og malloc.
Avatar billede rrm Nybegynder
19. august 2006 - 18:11 #7
Jeg bruger for tiden:
const string RE_ALPHA = "[a-zA-Z]";
const string RE_DIGIT = "[0-9]";
const string RE_DIGITS = RE_DIGIT + "+";
const string RE_HEX = "[0-9A-Fa-f]";

const string RE_ALPHA_DIGIT = "(" + RE_ALPHA + "|" + RE_DIGITS + ")";

const string RE_UNRESERVED = "(" + RE_ALPHA + "|" + RE_DIGIT + "|[$_.+-]|[!*'(),])";

const string RE_DOMAIN_LABEL = "" + RE_ALPHA_DIGIT + "|" + RE_ALPHA_DIGIT + "(" + RE_ALPHA_DIGIT + "|-)*" + RE_ALPHA_DIGIT;
const string RE_TOP_LABEL = "(" + RE_ALPHA + "|" + RE_ALPHA + "(" + RE_ALPHA_DIGIT + "|-)*" + RE_ALPHA_DIGIT + ")";

const string RE_HOST_NUMBER = "(" + RE_DIGITS + "\\." + RE_DIGITS + "\\." + RE_DIGITS + "\\." + RE_DIGITS + ")";

const string RE_HOSTNAME = "(" + RE_DOMAIN_LABEL + "\\.)*" + RE_TOP_LABEL;

const string RE_UCHAR = RE_UNRESERVED + "|%" + RE_HEX + RE_HEX;

const string RE_HSEGMENT = "(" + RE_UCHAR + "|[;:@&=])*";

const string RE_HPATH = RE_HSEGMENT + "(/" + RE_HSEGMENT + ")*";
const string RE_SEARCH = "(" + RE_UCHAR + "|[;:@&=])*";

const string RE_HOST = "^(" + RE_HOST_NUMBER + "|" + RE_HOSTNAME + ")[:/]{1}?";
const string RE_PORT = "^(:" + RE_DIGITS + "/)?";
const string RE_PATH = "^(/" + RE_HPATH + "([?]" + RE_SEARCH + ")?){1}?";

og når jeg kører programmet, uden at kalde funktioner der bruge disse strenge, så får jeg en del memory leaks, hvor jeg kan se [a-zA-Z] i outputtet fra _CrtDumpMemoryLeaks, kan ikke lige poste det da jeg har flyttet rundt på nogle filer for at få en bedre struktur i projektet og at jeg ligge skal rettet koden til...
Avatar billede rrm Nybegynder
19. august 2006 - 18:13 #8
her er den information jeg får i consolen:
{431} normal block at 0x003B8278, 224 bytes long.
Data: <^(/(([a-zA-Z]|[0> 5E 28 2F 28 28 5B 61 2D 7A 41 2D 5A 5D 7C 5B 30
Avatar billede rrm Nybegynder
19. august 2006 - 18:15 #9
Hvis jeg udkommenter alle const string undtagen de tre herunder
const string RE_HOST = "";
const string RE_PORT = "";
const string RE_PATH = "";

Så forsvinder memoryleaken...
Avatar billede bertelbrander Praktikant
19. august 2006 - 20:42 #10
Jeg går ud fra at dine "varible" er globale?

I så fald blive de først nedlagt når DLL'en forsvinder fra memory dvs efter DllMain har kørt med DLL_PROCESS_DETACH.

Jeg tror ikke at det er en rigtig memoryleak, og de er ikke rigtigt ansvar.

Hvorfor det kun gælder for nogle af dem har jeg dog ikke rigtigt nogen forklaring på.

Du kan løse problemet ved at putte alle disse string'e i en class og oprette en instans af denne class ved DLL_PROCESS_ATACH og delete den ved DLL_PROCESS_DETACH, inden du kalder _CrtDumpMemoryLeaks
Avatar billede rrm Nybegynder
20. august 2006 - 14:20 #11
Hmm, det havde jeg ikke lige tænkt på, nå men nu har jeg lavet en klasse hvor strengene bliver erklæret, så nu er leaks'ne væk, måske ikke den bedste løsning, men en mulig....
Avatar billede rrm Nybegynder
05. januar 2007 - 14:01 #12
Men tak for hjælpen, lig et svar...
Avatar billede rrm Nybegynder
19. januar 2008 - 10:33 #13
lukker da bertelbrander ikke smaler på point
Avatar billede rrm Nybegynder
19. januar 2008 - 10:33 #14
flot at jeg ikke kan stave... :(
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester