Я хочу поделиться с вами небольшим советом от Скотта Мейерса, автора книги Effective C++.

Позвольте мне спросить вас:

Знаете ли вы, когда использовать delete и когда использовать delete[]?

Например, правильный ли следующий пример?

std::string *myStrings=new std::string[10];

//...

delete myString;

Вы можете предположить, что поскольку мы вызываем delete, все объекты, созданные с помощью new, будут освобождены. На самом деле будет освобожден только один из 10 объектов.

Использование delete удалит только один объект. В приведенном выше коде у нас есть массив объектов, поэтому правильный способ удалить эти объекты — использовать delete[].

Например:

std::string *myStrings=new std::string[10];

//...

delete[] myString; //deletes an array of objects

Поэтому, когда у вас есть один объект, вы используете delete. Когда у вас есть массив объектов, вам нужно использовать delete[], как показано в примере ниже.

std::string *myName=new std::string;
std::string *myStrings=new std::string[10];

delete myName; //deletes an object
delete[] myString; //deletes an array of object.

Вы должны помнить, когда использовать delete и delete[]. Это связано с тем, что его использование в неправильном контексте приведет к неопределенному поведению.

Например, использование delete[] для myName или использование delete для myString приведет к неопределенному поведению.

Итак, совет Скотта следующий:

Если вы используете [] в новом выражении, вы должны использовать [] в соответствующем выражении delete. Если вы не используете [] в новом выражении, вы не должны использовать [] в соответствующем выражении delete.