Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zwalnianie pamieci

Ostatnio zmodyfikowano 2013-12-20 01:28
Autor Wiadomość
berkov
Temat założony przez niniejszego użytkownika
Zwalnianie pamieci
» 2013-12-13 23:58:19
Hey ho....

Obserwuje Task Manager przy runtime mojego program i wyglada na to ze po zamknieciu okna z ktorym stworzona jest klasa

pamiec praktycznie wogole sie nie zwalnia... mysle ze robie cos zle.

classes.h
C/C++
class PLATN
{
public:
    _variant_t pl_id;
    _variant_t pl_data;
    _variant_t pl_user;
    //i kolejne inne _variant_t
   
    HWND h_pl_rodzaj;
    //i kolejne inne HWND
};
class KONTR
{
public:
    PLATN ** list;
    _variant_t ko_id;
    _variant_t ko_data;
    //i kolejne inne _variant_t
   
    int yPos;
    bool PLAT_aktualna;
    SCROLLINFO si;
    HWND h_ko_status;
    HWND h_ko_wlasciciel;
    //i kolejne inne HWND
   
    void InitiatePLATN();
    void CreatePLATN();
    void UpdateKONTR();
    void ClearPLATN();
    bool CzeckKONTR();
    void UpdatePLATN();
    long SaveKONTR();
    void RELEASE();
};



classes.cpp
C/C++
void KONTR::CreatePLATN()
{
    LPSTR LV = "LV";
    WNDCLASSEX wLV;
    wLV.cbSize = sizeof( WNDCLASSEX );
    wLV.style = CS_DBLCLKS;
    wLV.lpfnWndProc = WndProc_KONTR_LV;
    wLV.cbClsExtra = 0;
    wLV.cbWndExtra = 0;
    wLV.hInstance = GetModuleHandle( 0 );
    wLV.hIconSm = LoadIcon( GetModuleHandle( 0 ), MAKEINTRESOURCE( ICON_MAIN ) );
    wLV.hIcon = LoadIcon( GetModuleHandle( 0 ), MAKEINTRESOURCE( ICON_MAIN ) );
    wLV.hCursor = LoadCursor( NULL, IDC_ARROW );
    wLV.hbrBackground =( HBRUSH ) COLOR_WINDOW;
    wLV.lpszMenuName = NULL;
    wLV.lpszClassName = LV;
   
    RegisterClassEx( & wLV );
   
    HWND hLv = CreateWindowEx( 0, LV, "x", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL, 10, this->yPos *- 1 + 445, 730, 200, this->h_mainwindow, NULL, GetModuleHandle( 0 ), NULL );
    this->h_LVwindow = hLv;
    ShowWindow( this->h_LVwindow, SW_SHOW );
   
    this->InitiatePLATN();
   
    //i tu petla tworze kolejne controlki, cos takiego tylko ze wiecej:
    for( i = 1; i <=( int ) this->ko_raty; i++ )
    {
       
        this->list[ i ]->h_pl_kolejnosc = CreateWindowEx( 0, "EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL | WS_DISABLED, 0, height, 50, 20, hLv,( HMENU ) MAKEINTRESOURCE( ID_pl_kolejnosc ), GetModuleHandle( NULL ),
       
        NULL );
       
        //itd....
    }
}



void KONTR::InitiatePLATN()
{
    list = new PLATN *[( long ) this->ko_raty + 1 ];
    for( long i = 0; i <=( long ) this->ko_raty; i++ )
    {
        this->list[ i ] = new PLATN;
    }
}

void KONTR::ClearPLATN()
{
    if(( long ) this->ko_raty > 0 )
    {
        for( long i = 0; i <=( long ) this->ko_raty; i++ )
        {
            delete this->list[ i ];
        }
       
        delete[] this->list;
    }
}
treaz.. na oknie glownym (HWND) this->h_mainwindow (ktory nota bene jest MDI, ale to raczej nie ma znaczenia) tworze poprzez wywolanie  CreatePLATN() (poprzedzone ClearPLATN() ) moje nowe okienko (cos a'la wlasne list view) a nastepnie wypelniam sobei moja nowa strukture PLATN.

Uzytkownikowi ma mozliwosc wileokrotnego wygenrerowania mojego autorskiego ListView (HWND hLv) poprzez wlasnei taki kod (zaleznie od tego ile jest ko_raty)...


klika na generuj, okno znika i generuja sie nowe z nowa klasa (stara idzie w nieopamiec)...

..gdzies w main.cpp:
C/C++
DestroyWindow( kontrakt->h_LVwindow );
kontrakt->ClearPLATN();
kontrakt->CreatePLATN();


Problem w tym ze pomimo wywolania DestroyWindow(kontrakt->h_LVwindow) oraz wyczyszczyenia mojej klasy PLATN pamiec sie nie zwalnia.. tylko non stop wzrasta o nowe okno hLV ( i nowa klase).....


czy cos robie zle?
wszystkei kontrolki sa WS_CHILD i czyszcze klase PLATN (kontrakt->ClearPLATN();) ... a moze trzeba tez zadbac o zmienne _variant_t w klasie KONTR?..

pamiec praktycznie wogole sie nie zwalnia..  a powinna chcociaz o kontrakt->h_LVwindow i jego dzieci - kontrolki...  _variant_t z KONTR tez powinny sie zwalniac same nie bedac juz uzywane... no ale w sumie, logicznie myslac skad system ma wiedziec ze juz nie beda uzywane, to ze nie mam wskaznika do klasy nie musi znaczyc ze klasa nie bedzie uzywana.....

sorry za troche chaotyczny kod ale byl bardzo dlugi wiec staralem sie wyciac to najwazniejsze, mam nadzieje ze niczego istotnego nie pominalem...

dzieki
b.
P-99158
DejaVu
» 2013-12-20 01:28:04
Opis jest chaotyczny, fragmenty kodu nie pomogą w wykryciu wycieku (jeżeli takowy jest). Warto również, abyś zapoznał się z STL-em, chociażby z kontenerem std::vector to kod by przyjaźniej wyglądał.

No i jeżeli pamięć się nie zwalnia to: Wykrywanie wycieków pamięci za pomocą Visual C++.
P-99683
« 1 »
  Strona 1 z 1