Рассмотрим этот код:
class DeleteMe
{
public:
~DeleteMe()
{
std::cout << "Thanks mate, I'm gone!\n";
}
};
int main()
{
DeleteMe *arr = new DeleteMe[5];
delete arr;
return 0;
}
Если вы запустите его в VS2005, он напечатает:
Thanks mate, I'm gone!
Если вы измените main()
на правильное соответствие стандарту C ++:
int main()
{
DeleteMe *arr = new DeleteMe[5];
delete[] arr;
return 0;
}
Будет напечатано:
Thanks mate, I'm gone!
Thanks mate, I'm gone!
Thanks mate, I'm gone!
Thanks mate, I'm gone!
Thanks mate, I'm gone!
Не стреляйте себе в ногу. VS2005 будет НЕ делать правильные вещи, если вы не соответствуете различным вариантам нового / удаления. Ни один другой стандартный C ++ совместимый компилятор не будет.
Вокруг operator new
и operator delete
(и их различных разновидностей) происходит некоторая магия компилятора, в основном, вызовы ctors и dtors добавляются за кулисами. Эта магия зависит от этих маленьких скобок [], поэтому не теряйте их, иначе вы потеряете магию.