Tablica dynamiczna z zerową ilością elementów

0

Cześć, mam do was takie pytanie: czy prawidłowym jest taka operacja:

double* tablica = new double[0];
delete[] tablica;

Chodzi mi o to, że najpierw alokuję pamięć na tablicę, której wielkość wynosi 0! czyli de facto nie posiada żadnych elementów a następnie kasuję taką pustą tablicę operatorem delete[]...
Z góry dzięki za pomoc.

3

Operacja jest bez sensu, aczkolwiek technicznie rzecz biorąc jest prawidłowa ;]

0
Shalom napisał(a):

Operacja jest bez sensu, aczkolwiek technicznie rzecz biorąc jest prawidłowa ;]

Bez sensu może wygląda, bo dałem 0. W praktyce jest tam jakaś zmienna, która może być również zerem. I teraz miałem wątpliwość, czy przed alokowaniem pamięci muszę sprawdzać, czy ta zmienna jest != 0 czy mogę alokować w ciemno - najwyżej skasuje się pustą tablicę :).
Dla pewności wyjaśniam, że w/w wskaźnik ma wstępnie przypisaną wartość nullptr a gdy chcę zaalokować pamięć to robię coś takiego:

if(tablica)
delete[] tablica;
tablica = new double[nowy_rozmiar];

Dzięki!

1

Nie, nie musisz sprawdzać (chyba, że używasz std::nothrow). new nigdy nie zwróci nullptr, tylko rzuci std::bad_alloc.

edit: przy okazji, delete wskaznik_null to jak najbardziej poprawny C++.

§ 5.3.5/2
In the second alternative (delete array), the value of the operand of delete may be a null pointer value or a pointer value that resulted from a previous array new-expression.

0
kq napisał(a):

Nie, nie musisz sprawdzać (chyba, że używasz std::nothrow). new nigdy nie zwróci nullptr, tylko rzuci std::bad_alloc.

No ale jak robię tak tablica = new double[0]; to tablica != nullptr; dlatego sprawdzam, czy była już alokowana pamięć w tej zmiennej (nie ważne jak duża - w tym 0) -> jeśli tak to robię delete[] i alokuję nowy fragment w pamięci :).
Natomiast "chyba" używam std::nothrow -> jeszcze nie wiem za bardzo co to jest :P (ale nie bawię się w rzucanie wyjątków).

2

std::nothrow nie możesz użyć przez przypadek.

int * v = new (std::nothrow) int[x];

W powyższym kodzie v może być równe nullptr, a wyjątek nie zostanie rzucony.

Co do sprawdzania, czy coś tam wcześniej było - tak jak pisałem, delete na null pointerze jest w pełni poprawne i może być no-opem.

0
kq napisał(a):

Co do sprawdzania, czy coś tam wcześniej było - tak jak pisałem, delete na null pointerze jest w pełni poprawne i może być no-opem.

Wow, właśnie zrozumiałem co do mnie pisałeś ;). Dzięki!

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