В C # и Java вы используете new для создания экземпляра любого класса, и тогда вам не нужно беспокоиться о его уничтожении позже.
В C ++ также есть ключевое слово new, которое создает объект, но, в отличие от Java или C #, это не единственный способ создания объекта.
В C ++ есть два механизма для создания объекта:
- автоматический
- динамический
При автоматическом создании вы создаете объект в среде с заданной областью действия: - в функции или - как член класса (или структуры).
В функции вы должны создать это следующим образом:
int func()
{
A a;
B b( 1, 2 );
}
Внутри класса вы обычно создаете его следующим образом:
class A
{
B b;
public:
A();
};
A::A() :
b( 1, 2 )
{
}
В первом случае объекты уничтожаются автоматически при выходе из блока области видимости. Это может быть функция или блок области видимости внутри функции.
В последнем случае объект b уничтожается вместе с экземпляром A, членом которого он является.
Объекты выделяются с помощью new, когда вам нужно контролировать время жизни объекта, а затем требуется удаление для его уничтожения. С помощью техники, известной как RAII, вы заботитесь об удалении объекта в момент его создания, помещая его в автоматический объект, и ждете, пока деструктор этого автоматического объекта вступит в силу.
Одним из таких объектов является shared_ptr, который вызовет логику «удаления», но только тогда, когда все экземпляры shared_ptr, которые совместно используют объект, будут уничтожены.
В общем, хотя в вашем коде может быть много вызовов new, у вас должно быть ограниченное количество вызовов для удаления и всегда следует убедиться, что они вызываются из деструкторов или объектов «удаления», которые помещаются в интеллектуальные указатели.
Ваши деструкторы также никогда не должны создавать исключения.
Если вы сделаете это, у вас будет несколько утечек памяти.