Я хочу поделиться с вами небольшим советом от Скотта Мейерса, автора книги 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.