C++ new int[0] - czy przydziela pamięć?

Prosta aplikacja testowa:

cout << new int[0] << endl;

Wyjścia:

0x876c0b8
Wygląda na to, że działa. Co na to norma? Czy zawsze legalne jest "przydzielanie" pustego bloku pamięci?
Author: SCFrench, 2009-07-06

5 answers

Od 5.3.4 / 7

Gdy wartość wyrażenia w direct-new-declarator wynosi zero, funkcja alokacji jest wywoływana w celu przydzielenia tablicy bez elementów.

Z 3.7.3.1/2

Efekt dereferencji wskaźnika zwracanego jako żądanie dla rozmiaru zerowego jest niezdefiniowany.

Również

Nawet jeśli rozmiar żądanej przestrzeni [przez new] wynosi zero, żądanie może się nie powieść.

To znaczy, że możesz to zrobić, ale możesz nie legalnie (w dobrze zdefiniowany sposób na wszystkich platformach) usuwa pamięć, którą dostajesz - możesz ją tylko przekazać do array delete - i powinieneś ją usunąć.

Tutaj znajduje się interesująca notatka (tzn. nie jest to normatywna część normy, ale zawarta w celach ekspozycyjnych) dołączona do zdania z 3.7.3.1/2

[32. Intencją jest, aby operator new() mógł być zaimplementowany przez wywołanie malloc() lub calloc (), więc reguły są zasadniczo takie same. C++ różni się od C w Wymaganie żądania zerowego, aby zwrócić wskaźnik inny niż null.]

 209
Author: Faisal Vali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-31 19:17:50

Tak, przydzielanie tablicy o rozmiarze zerowym jest legalne. Ale musisz go również usunąć.

 20
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-06 13:45:23

Co na to norma? Czy zawsze legalne jest "przydzielanie" pustego bloku pamięci?

Każdy obiekt ma unikalną tożsamość, tzn. unikalny adres, co oznacza niezerową długość (rzeczywista ilość pamięci zostanie po cichu zwiększona, jeśli poprosisz o zero bajtów).

Jeśli przydzielisz więcej niż jeden z tych obiektów, zauważysz, że mają różne adresy.

 15
Author: ChrisW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-06 13:49:34

Tak jest całkowicie legalne przydzielanie {[0] } wielkości bloku z new. Po prostu nie możesz zrobić z nim nic użytecznego, ponieważ nie ma ważnych danych, do których możesz uzyskać dostęp. Jest nielegalne.

Uważam jednak, że standard pozwala na takie rzeczy jak malloc(0) zwracać NULL.

Nadal będziesz musiał delete [] niezależnie od tego, jaki wskaźnik otrzymasz z przydziału, jak również.

 13
Author: Evan Teran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-14 16:31:26

Co ciekawe, C++ wymaga, aby operator new zwrócił prawidłowy wskaźnik nawet wtedy, gdy wymagane są zerowe bajty. (Wymagając tego dziwnie brzmiącego zachowanie upraszcza rzeczy w innym języku.)

Znalazłem Effective C++ Third Edition powiedział tak w"poz.

 1
Author: shuaihanhungry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-27 11:51:03