2010-03-23 8 views

Odpowiedz

4

Tak, ściśle przy korzystaniu z delete[] statyczny typ wskaźnika, który ma być delete[], musi być zgodny z typem pierwotnie przydzielonej macierzy lub występuje niezdefiniowane zachowanie.

Zwykle w wielu implementacjach delete[] wywoływał void*, który jest faktycznie tablicą typu, który nie zawiera nietrywialnego destruktora, ale nie jest gwarantowany.

delete[] buffer 

lub

delete[] (char*)something 

będzie zarówno ważność.

5

Tak.

ze standardowego (5.3.5 Usuń):

Wartość operand usuwania jest wartość wskaźnika, który wynikało z poprzedniej tablicy new-expression.72) Jeśli nie, zachowanie jest niezdefiniowane. [Uwaga: oznacza to, że składnia wyrażenia delete musi być zgodna z typem obiektu przydzielonego przez nową, , a nie składnią nowego wyrażenia. ]

W pierwszym przypadku (usuwanie obiektu), jeżeli statyczny typ argumentu jest różny od jej dynamicznego rodzaj, typ statyczny powinien być bazą klasa argumentu dynamicznym typu i statyczne Typ powinien mieć wirtualny destruktor lub jego zachowanie jest niezdefiniowane. W drugiej alternatywie (tablica usuwania), jeśli dynamiczny typ obiekt, który ma być usunięty różni się od jego statycznego typu, zachowanie jest niezdefiniowane *.

** Oznacza to, że obiektu nie można usunąć za pomocą wskaźnika typu void *, ponieważ nie ma obiektów typu void.

+0

To nie tylko wartość operandu, ale także typ, patrz następny akapit w 5.3.5 (3). –

+0

@Charles Bailey Naprawiono. – sinek