Tablica dwuwymiarowa, a wyciek pamieci

0

Czesc,

Chce korzystac z dwuwymiarowej tablicy obiektow, niech to beda np. obiekty klasy Osoba

to jest kostruktor:

MyArray::MyArray ()
{
if ( ar = new Person* [8] )
{
for (int i = 0; i < 8; i++)
{
ar[i] = new Person[8];
}
}
}

Problem pojawia sie gdy zabraknie pamieci i jeden z'new' rzuci wyjatkiem wtedy obiekt MyArray nie bedzie kompletnie skonstruowany, wiec
nie wywola sie destruktor, wiec uprzednio zarezerwowana pamiec nie bedzie
nigdy zwolniona

JAK TEGO UNIKNAC ?

0

new nie rzuca wyjatkiem, tylko zwraca null w przypadku braku pamieci. Po drugie dlaczego mialo by jej braknac? Na cale 8 elementow, to naprawde musialoby byc kiepsko...

pozdrawiam
johny

0

8 x 8
Ale faktycznie poprzednik ma rację. Zrób konstruktor domyślny, który będzie inicjował tablicę NULL-ami. Potem zrób drugą metodę, którą przydzielisz pamięć. Wtedy w destruktorze umieścisz sprawdzenie IsNull() przez usunięciem obiektu.

0
grzesko napisał(a)

8 x 8
Ale faktycznie poprzednik ma rację. Zrób konstruktor domyślny, który będzie inicjował tablicę NULL-ami. Potem zrób drugą metodę, którą przydzielisz pamięć. Wtedy w destruktorze umieścisz sprawdzenie IsNull() przez usunięciem obiektu.

Fakt 8x8 - to i tak niewiele. Sprawdzac nie trzeba, bo delete dla wskaznika=null nic nie robi.

pozdrawiam
johny

0
johny_bravo napisał(a)

new nie rzuca wyjatkiem, tylko zwraca null w przypadku braku pamieci.

Z tym to różnie bywa bo w dokumentacji Borland'a jest:

If successful, new returns a pointer to the allocated memory. If the allocation fails, the new operator will call the new_handler function. The default behavior of new_handler is to throw an exception of type bad_alloc. If you do not want an exception to be thrown, use the nothrow version of operator new. The nothrow versions return a null pointer result on failure, instead of throwing an exception.

0

Dzieki za wasze opinie. Pamietajmy jednak, ze to byl tylko przyklad (8x8). Co jesli to bedzie bardzo duza tablica i tej pamieci zabraknie? Proponowane przez was rozwiazania sa mi znane, slyszalem jednak o 'auto_ptr' podobno byloby to najlepsze wyjscie z tej sytuacji. Czy ktos z was korzystal z tego ?

0

Co jesli to bedzie bardzo duza tablica i tej pamieci zabraknie?

Jak to zabraknie??? Chyba nie będziesz tworzyć tablic >500MB???

Proponowane przez was rozwiazania sa mi znane, slyszalem jednak o 'auto_ptr' podobno byloby to najlepsze wyjscie z tej sytuacji.

Wydaje mi się, że auto_ptr ma się nijak do twojego problemu. Opcja z NULLem jest sensowna ;)

PS. a propos wyjątków w new zawsze możesz przeciążyć operator dla tej klasy (włącznie z delete) i zrobić własną metodę zgłaszania blędu.

0

Wydaje mi się, że auto_ptr ma się nijak do twojego problemu. Opcja z NULLem jest sensowna ;)

I tu sie zgadzam. Stad sie wzialo moje pytanie na tym forum. Otoz pisze mala gierke w c++ na zaliczenie i dostalem taka wskazowke od prowadzacego ( taka mala zagadka). Gosc zna sie na tym co robi, ja tego nie widze.

0

Zawsze mozesz uzyc shared_ptr z boost'a i olac zwalnianie pamieci.

MyArray::MyArray ()
{
    ar = boost::shared_ptr(Person) (new Person);
}

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