W C # i Javie, używasz new do tworzenia instancji dowolnej klasy i nie musisz się martwić o jej późniejsze zniszczenie.
C ++ ma również słowo kluczowe „new”, które tworzy obiekt, ale w przeciwieństwie do Javy czy C # nie jest to jedyny sposób tworzenia obiektu.
C ++ ma dwa mechanizmy tworzenia obiektu:
Dzięki automatycznemu tworzeniu obiekt tworzysz w środowisku o określonym zakresie: - w funkcji lub - jako element członkowski klasy (lub struktury).
W funkcji utworzyłbyś ją w ten sposób:
int func()
{
A a;
B b( 1, 2 );
}
W klasie normalnie utworzyłbyś ją w ten sposób:
class A
{
B b;
public:
A();
};
A::A() :
b( 1, 2 )
{
}
W pierwszym przypadku obiekty są niszczone automatycznie po wyjściu z bloku zasięgu. Może to być funkcja lub blok zakresu w funkcji.
W tym drugim przypadku obiekt b jest niszczony wraz z instancją A, w której jest członkiem.
Obiekty są przydzielane jako nowe, gdy trzeba kontrolować okres istnienia obiektu, a następnie wymaga usunięcia, aby go zniszczyć. Dzięki technice znanej jako RAII zajmujesz się usuwaniem obiektu w miejscu, w którym go tworzysz, umieszczając go w obiekcie automatycznym i czekając, aż destruktor tego automatycznego obiektu zacznie działać.
Jednym z takich obiektów jest shared_ptr, który wywoła logikę „deleter”, ale tylko wtedy, gdy wszystkie instancje shared_ptr, które współużytkują obiekt, zostaną zniszczone.
Ogólnie, chociaż twój kod może mieć wiele wywołań new, powinieneś mieć ograniczone wywołania do usuwania i zawsze powinieneś upewnić się, że są one wywoływane z destruktorów lub obiektów „deleter”, które są umieszczane w inteligentnych wskaźnikach.
Twoje destruktory również nigdy nie powinny rzucać wyjątków.
Jeśli to zrobisz, będziesz miał kilka wycieków pamięci.