2009-08-11 14 views
5

Patrząc na przykładowy kod i natrafiamy na przydział tablicy o zerowym rozmiarze. I stworzył następujący fragment kodu, aby wyjaśnić moje pytanieCo robi/przypisuje alokacja tablicy o zerowym rozmiarze?

Dotyczy to kod:

class T 
{ 
}; 

int main(void) 
{ 
    T * ptr = new T[0]; 

    return 0; 
} 

co jest jego wykorzystanie? Czy ptr jest prawidłowy? Czy ten konstrukt jest przenośny?

Odpowiedz

8

5.3.4 w C++ Standard:

6 Każdy stałej ekspresji w bezpośrednim-new-declarator powinny być integralną stałą wyrażenie (5.19) i ocenia się ściśle dodatnią wartość. wyrażenie w bezpośrednim-new-declarator mają integralną lub wyliczenia typu (3.9.1) o wartości nieujemnej ...

7 Gdy wartość wyrażeniaw sposób bezpośredni -new-deklarator ma wartość zero, funkcja alokacji jest wywoływana w celu przydzielenia tablicy bez elementów.

Twój kod przydziela tablicę, która zachowuje się pod każdym względem, jak każda inna tablica T (można ją usunąć za pomocą delete [], przekazać jako parametr, prawdopodobnie inne rzeczy). Jednak nie ma dostępnych indeksów (tzn. Czytanie lub pisanie ptr [0] powoduje niezdefiniowane zachowanie).

W tym kontekście różnica między wyrażeniem stałym a wyrażeniem nie jest tym, czy wyrażenie rzeczywiste jest stałą czasową kompilacji (która oczywiście wynosi 0), ale czy określa "ostatni" wymiar tablicy wielowymiarowej.Składnia jest zdefiniowana w 5.3.4: 1.

0

Tak, to jest prawidłowe zachowanie, a ptr będzie ważne. Konstrukcja jest przenośna dla wszystkich kompilatorów C++ zgodnych ze standardem C++. Jest to użyteczne w tym, że pozwala napisać kod, który nie wymaga specjalnego przypadku do obsługi przypadku, w którym liczba elementów wynosi zero.

Jednak, jak zwykle, lepiej będzie Ci posłużyć się za pomocą std :: vector (który również może mieć zerową wielkość) zamiast tablicy.

2

Jest autoryzowany (5.3.4/6). Jego wynikiem jest pusta tablica, więc zwrócona wartość jest wskaźnikiem za tablicą.

0

Powiązane pytanie brzmi: What should malloc(0) return?

And from some C99 docs, malloc (0) zachowanie jest realizacja zdefiniowane: Funkcje realloc

czy w calloc, malloc i zwróci NULL wskaźnik lub grupę wskaźnik do przydzielonego obiektu , gdy żądany rozmiar wynosi zero (7.20.3).

Zwracany jest wskaźnik zerowy lub unikalny wskaźnik , który może zostać przekazany jako wolny() .

Zobacz stronę man malloc (3C).

To prawda, że ​​pytasz o C++, ale informacja o malloc jest i tak użyteczna.

+1

Nowy C++ jest dobrze zdefiniowany. – AProgrammer

Powiązane problemy