Problem ze zwalnianiem pamięci

Odpowiedz Nowy wątek
2011-08-29 12:00
0

Witam, zauważyłem, że mój program operujacy na dynamicznym przydzielaniu pamięci po jej zwolnieniu gdzieś zawsze "gubi" parę kB, czyli aplikacja w menagerze po operacji przydzielenia i zwolnienia zajmuje trochę więcej.

Zrobiłem uproszczony przykład :

 
#include "stdafx.h"
#include <vector>
 
struct Sgroup
{
    TCHAR GroupName[100];
    int GroupID;
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    Sgroup* wsk;
    std::vector<Sgroup*> wektorek;
 
    for(int z=0;z<10000;z++) {
        wsk=new Sgroup;
        wektorek.push_back(wsk);
    }
 
    for(int x=0;x<10000;x++) delete wektorek[x];
 
    wektorek.clear();
 
    return 0;
}

Program przed pierwszą pętlą zajmije w menagerze 300K, po pętli 2924K , po drugiej pętli w której wg moich założeń powinien zwonić przydzieloną pamięć zajmuje 1832K . Pytanie brzmi co robię źle ?

Pozostało 580 znaków

2011-08-29 12:11
0

wszystko jest ok.

pozmieniałem trochę (mam linuxa) :

 
#include <vector>
 
struct Sgroup
{
        char GroupName[100];
        int GroupID;
};
 
int main(int argc, char **argv)
{
        Sgroup* wsk;
        std::vector<Sgroup*> wektorek;
 
        for(int z=0;z<10000;z++)
        {
                wsk=new Sgroup;
                wektorek.push_back(wsk);
        }
 
        for(int x=0;x<10000;x++) 
        {
            delete wektorek[x];
        }
 
        wektorek.clear();
 
        return 0;
}
 

i odpaliłem w valgrindzie:

==5577== Memcheck, a memory error detector
==5577== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==5577== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==5577== Command: ./wektorek
==5577== 
==5577== 
==5577== HEAP SUMMARY:
==5577==     in use at exit: 0 bytes in 0 blocks
==5577==   total heap usage: 10,015 allocs, 10,015 frees, 1,171,068 bytes allocated
==5577== 
==5577== All heap blocks were freed -- no leaks are possible
==5577== 
==5577== For counts of detected and suppressed errors, rerun with: -v
==5577== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 18 from 7)

Pozostało 580 znaków

2011-08-29 12:12
0

nic nie robisz źle. vector po użyciu funkcji clear() nie zwalnia pamięci.

jeśli chcesz wykonywać pomiary to najpierw zrób taką pętle:
for(int z=0;z<10000;z++) {
wektorek.push_back(NULL);
}

później zmierz pamięć pierwszy raz.
później utworz elementy:
for(int x=0;x<10000;x++) wektorek[x]=new Sgroup;
wykonaj pomiar drugi raz żeby zobaczyć ile Ci doszło,
zrób:
for(int x=0;x<10000;x++) delete wektorek[x];
i dopiero teraz porównaj pierwszy pomiar z drugim.

LUB
std::vector<Sgroup> wektorek = new std::vector<Sgroup>;
//wektorek->push_back(wsk);
//delete (
wektorek)[x];
delete wektorek;


░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2011-08-29 12:18
0

może to pomoże:
http://www.cplusplus.com/reference/stl/vector/capacity/

i

http://www.cplusplus.com/reference/stl/vector/push_back/ :

This effectively increases the vector size by one, **which causes a reallocation of the internal allocated storage if the vector size was equal to the vector capacity** before the call. Reallocations invalidate all previously obtained iterators, references and pointers.

ogólnie bym się nie przejmował tym. jeśli ci zależy na każdym kilobajcie zajmowanej pamięci podczas działania programu, to raczej musisz stworzyć swój własny kontener zoptymalizowany pod twój problem

edytowany 1x, ostatnio: rafal__, 2011-08-29 12:18

Pozostało 580 znaków

2011-08-29 12:36
0

Dzięki za odpowiedzi, uspokoiliście mnie trochę :)

krwq zrobiłem wg twojego przykładu i wynik był taki 444K po stworzeniu wektora NULLów , 2936K po zapełnieniu strukturami, 912K po pętli z delete. Czyli "zjadło" prawie 500K.
Zrobiłem następnie inny eksperyment, zapętliłem 100x proces przydzielania pamieci wektorowi i jej zwalniania, komp się zamulił na sporą chwile i po tej operacji miałem zajęte 456K więc chyba faktycznie nic nie jest gubione bo po 100 pętlach powinno mi zjeść trochę ramu.

"ogólnie bym się nie przejmował tym. jeśli ci zależy na każdym kilobajcie zajmowanej pamięci podczas działania programu, to raczej musisz stworzyć swój własny kontener zoptymalizowany pod twój problem"

Nie, nie chodzi mi o oszczędzanie pamięci (w granicach rozsądku) ale o pewność, że nic nie gubię :)

edytowany 1x, ostatnio: Yoshi_80, 2011-08-29 12:38

Pozostało 580 znaków

2011-08-29 12:52
0

Żeby zwolnić całkiem pamięć po elementach wektora użyj swap(), przykład:
http://stackoverflow.com/questions/3477715/c-vectorclear

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0