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

Zwalnianie dynamicznie utworzonej tablicy wskaznikow

Ostatnio zmodyfikowano 2013-10-24 06:52
Autor Wiadomość
berkov
Temat założony przez niniejszego użytkownika
Zwalnianie dynamicznie utworzonej tablicy wskaznikow
» 2013-10-20 19:08:21
Hey ho.

Mam kod:
C/C++
class COLLIST
{
public:
    long count;
    _variant_t * list[];
   
    void Create();
    void Clear();
};

opis metod:
C/C++
void COLLIST::Create()
{
    list[ 0 ] = NULL;
    for( long i = 1; i <= this->count; i++ )
    {
        this->list[ i ] = new _variant_t;
    }
};

void COLLIST::Clear()
{
    delete[] this->list;
}


i zalozmy ze w main mam nastepujacy kod:
C/C++
COLLIST * collist = new COLLIST;
collist->count = 10;
collist->Create();
//Tu jakis kod...
collist->Clear(); //tu dostaje blad

Cos jest nie tak z funkcja Clear() bo przy wywolaniu dostaje nastepujacy komunikat:
Debug Assertion Failed!
Program: xxx
File: xxx
Line: xx

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse).

co robie zle?
Czemu nie moge wyczyscic dynamicznej tablicy wskaznikow o zmiennej liczbie wpisow?

z gory dzieki
b
P-94143
Monika90
» 2013-10-20 19:20:14
C/C++
_variant_t * list[];
To jest źle, tablica będąca niestatyczną składową klasy musi mieć podany rozmiar. A tobie zapewne chodziło o
C/C++
_variant_t ** list;
P-94146
berkov
Temat założony przez niniejszego użytkownika
» 2013-10-21 07:33:42
@Monika,
Ahoj, jedna gwiazdka jeszcze jest znosna, ale dwa wskazniki za soba to az straszy! haha
Sprobowalem ale nie wiem jak mam pozniej zainicjoowac poszczegolne zmienne przy takiej definici tablicy jak podalas.
Kompliator (a wlasciwie juz runtime) przy wykonaniu Create() czepia sie (Unhgandled exception... Access violation) tu:
list[ 0 ] = NULL;
a nawet jak zakomentuje ta linijke to przyczepi sie oczywiscie do nastepnej:
this->list = new _variant_t;

Przy okazji poprzedni temat zamkniety, nie zdazylem podziekowac wiec dziekuje tu, uzylem twojego sposobu czesciowo + wlasnie _variant_t ktory potrafi przechowac praktycznie wszystko i dodatkowo jeszcze wiec co przechowuje.
P-94175
Monika90
» 2013-10-21 13:09:09
Jesteś pewien, że potrzeba ci tablicy wskaźników do _variant_t, a nie po prostu tablicy _variant_t? No ale jeżeli tak, to najpierw alokujesz tablicę, a potem jej elementy:
C/C++
_variant_t ** list = new _variant_t *[ n ];
for( std::size_t i = 0; i < n; ++i )
     list[ i ] = new _variant_t;


Usuwanie:
C/C++
for( std::size_t i = 0; i < n; ++i )
     delete list[ i ];

delete[] list;
P-94183
berkov
Temat założony przez niniejszego użytkownika
» 2013-10-21 15:35:21
Ok tak naprawde to potrzebna jest mi tablica z _variant_t, tylko dynamiczna z dynamicznie przydzielona iloscia elementow (_variant_t).
W momencie utworzenia nowej klasy COLLIST (tu collist) ma sie tylko zaldowac informacja ze bedzie taka tablica, ilosc jej elementow zostanie ustalona dopiero w trakcie dzialania programu przez wywolanie metody CREATE() ktora poprzedzona jest wypelnieniem informacji o ilosci elementow (count):
C/C++
collist->count = 10; //10 wpisuje uzytkownik
collist->Create();
 dopiero tutaj nastapic ma wypelnienie elementow tablicy klasami _variant_t (tutaj konkretnie ma ich byc 10).
w moim przykladzie po skompilowaniu wszystko dziala ok, mam sobie swoje _variant_t nawet moge w nich zapisywac i z nich czytac, szopki pojawiaja sie dopiero jak chce usunac moja collist-list[] przez delete:
delete [] this->list; albo jak zmykam caly program to kompilator sie drze ze  mam przeciek pamieci.

Twojego kodu niestety nie moge nawet skompilowac bo w momencie inicjalizacji klasy nie znam ilosc elementow w tablicy (u ciebie "n") to raz, a dwa nie moge w xxx.h miec znaku "=" w definicji mojej klasy COLLIST, moge miec maksymalnie cos takiego:
_variant_t ** list[];
co tak naprawde nic mi nie daje....


Wiem ze to troche pogmatwane, w kilku slowach generlanie chodzi o to by stworzyc klase ktora bedzie miala tablice (list[]) z _variant_t o zmiennej ilsoci elementow (zalezne od inputu uzytkownika) ktore (te _variant_t) bede mogl pozniej wypelniac jak Bozia dala, i usuwac jak Pan Bog przykazal.

b
.
P-94194
Monika90
» 2013-10-21 23:28:57
Twojego kodu niestety nie moge nawet skompilowac bo w momencie inicjalizacji klasy nie znam ilosc elementow w tablicy (u ciebie "n") to raz, a dwa nie moge w xxx.h miec znaku "=" w definicji mojej klasy COLLIST
A nie przyszło Ci do głowy, żeby oddzielić deklarację od przypisania?
W klasie:
_variant_t * list;
, a w funkcji:
list = new _variant_t[ count ];
.
list jest tutaj wskaźnikiem do pierwszego elementu dynamicznie utworzonej tablicy variantów.

moge miec maksymalnie cos takiego: _variant_t ** list[];
Tak się nie da, nie można mieć pustych nawiasów [] w deklaracji niestatycznej składowej. Powiedz kompilatorowi, żeby nie przepuszczał takich błędów.

bede mogl pozniej wypelniac jak Bozia dala, i usuwac jak Pan Bog przykazal.
Liczyłam na to, że przynajmniej Czech będzie ateistą...
P-94262
berkov
Temat założony przez niniejszego użytkownika
» 2013-10-22 17:47:03
Ahoj

no wiec, nie wiem czemu zawsze myslalem ze jak sie deklaruje tablice dynamicznie to od razu trzeba kompilatorowi rzec ze ma do czynienia z tablica, stad zawsze pchalem [] od samego poczatku.


Oto moj kod:
C/C++
class COLLIST
{
public:
    long count;
    _variant_t ** list;
   
    void Create();
    void Clear();
};

void COLLIST::Create()
{
    list = new _variant_t *[ this->count + 1 ];
    list[ 0 ] = NULL;
    for( long i = 1; i <= this->count; i++ )
    {
        this->list[ i ] = new _variant_t;
    }
}
void COLLIST::Clear()
{
    for( long i = 1; i <= this->count; i++ )
    {
        delete this->list[ i ];
    }
   
    delete[] list;
}


i DZIALA ....JAK TA LALA!

I chyba zupelnie przez przypadek zrozumialem zasade dynamicznewgo przydzielania i zwalniania pamieci i calej tej bajki zwiazanej z wskaznikami :-)
Chyba jak kurs czytalem to musialem przysnac i zawsze to bylo moja zmora, przydzielalem pamiec ale nie do konca rozumialem dlaczego.. dzieki


Mialas tez racje, wcale nie potrzebowalem tablicy wskaznikow do _vairant_t a wystarczylaby rownie dobrze tablica do _variant_t:
C/C++
class COLLIST
{
public:
    long count;
    _variant_t * list;
   
    void Create();
    void Clear();
};

void COLLIST::Create()
{
    list = new _variant_t[ this->count + 1 ];
   
};

void COLLIST::Clear()
{
   
    delete[] list;
};


roznica tylko w dostaniu sie do srodka:
w I:
collist->list[ i ]->costam
w II:
collist->list[ i ].costam

Teraz tylko pytanie, jesli moge uzyc oba rozwiazania to czy z punktu widzenia "good programming pratice" istnieje jakas roznica miedzy tablica na wskazniki _variant_t a poporstu na _variant_t?


a co do czechow to u nas najwiekszy procent ludzi wierzy... V PIVO.
stad tez zapewne wywodzi sie nasza druga charakterystyczna cecha narodowa czyli obsikiwanie wszystkiego i wszedzie (nawet w centrum miasta) oraz wszechobecna akceptacja tego faktu, ... nie do konca jednak jestem pewien czy jest tu z czego byc dumnym LOL
P-94323
Monika90
» 2013-10-24 00:26:18
Teraz tylko pytanie, jesli moge uzyc oba rozwiazania to czy z punktu widzenia "good programming pratice" istnieje jakas roznica miedzy tablica na wskazniki _variant_t a poporstu na _variant_t?
Tablica wskaźników jest bardziej skomplikowana i ma mniejszą wydajność, dlatego że masz wiele małych alokacji/dealokacji pamięci zamiast jednej dużej (czyli jest wolniej). Na dodatek, obiekty mogą nie leżeć w jednym ciągłym obszarze pamięci (źle z punktu widzenia pamięci podręcznej).

Teoretycznie kompilator może połączyć wiele małych alokacji w jedną dużą, ale takie kompilatory nie są jeszcze zbyt popularne.
P-94435
« 1 » 2
  Strona 1 z 2 Następna strona