У 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, в якому він є членом.
Об'єкти виділяються новими, коли вам потрібно контролювати термін експлуатації об'єкта, а потім для його знищення потрібне видалення. Завдяки техніці, відомій як RAII, ви дбаєте про видалення об'єкта в точці, яку ви створюєте, вводячи його в автоматичний об'єкт, і чекаєте, коли деструктор цього автоматичного об'єкта набере чинності.
Одним із таких об'єктів є shared_ptr, який викликатиме логіку "делетер", але лише тоді, коли всі екземпляри shared_ptr, які діляться об'єктом, будуть знищені.
Загалом, хоча ваш код може мати багато дзвінків до нових, у вас повинні бути обмежені виклики для видалення, і завжди слід переконатися, що вони викликаються від деструкторів або об'єктів "видалення", які розміщуються в смарт-покажчики.
Ваші деструктори також ніколи не повинні кидати винятків.
Якщо ви це зробите, у вас буде мало витоків пам'яті.