Mam na myśli, jeśli mam jakąś klasę typu:
class A{
int* pi;
};
*A pa;
Kiedy zadzwonię do delete pa
, czy pi
zostanie usunięty?
3 odpowiedzi
Musisz zdefiniować destruktor do delete pi;
. Ponadto musisz również zdefiniować konstruktor kopiujący i operator przypisania, w przeciwnym razie, gdy kopiowane jest wystąpienie A
, dwa obiekty będą wskazywać na ten sam int
, który zostanie usunięty, gdy jedno z wystąpień A
zostaje zniszczony, pozostawiając inne wystąpienie A
z wiszącym wskaźnikiem.
Na przykład:
class A
{
public:
// Constructor.
A(int a_value) : pi(new int(a_value)) {}
// Destructor.
~A() { delete pi; }
// Copy constructor.
A(const A& a_in): pi(new int(*a_in.pi)) {}
// Assignment operator.
A& operator=(const A& a_in)
{
if (this != &a_in)
{
*pi = *a_in.pi;
}
return *this;
}
private:
int* pi;
};
Powinieneś zaimplementować destruktor ~A()
, który zajmie się czyszczeniem zawartości A
. Następnie wywołanie delete
na wskaźniku typu A
oczyści wszystko.
Będziesz musiał napisać destruktor, aby usunąć wszystkie składowe typu wskaźnika. Coś jak:
class A
{
int *pi;
public:
~A(){delete pi;}
};
Musisz upewnić się, że twój konstruktor przypisuje wartość pi (co najmniej NULL). i podobnie jak odpowiedź z @hmjd, będziesz musiał zaimplementować lub ukryć konstruktor kopiujący i operatory przypisania. Poszukaj tutaj zasady trzech: http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B %2B_programming%29
Podobne pytania
Powiązane pytania
Nowe pytania
c++
C ++ to język programowania ogólnego przeznaczenia. Pierwotnie został zaprojektowany jako rozszerzenie C i ma podobną składnię, ale teraz jest to zupełnie inny język. Użyj tego tagu w przypadku pytań dotyczących kodu (który ma zostać) skompilowany za pomocą kompilatora C ++. Użyj znacznika specyficznego dla wersji w przypadku pytań związanych z określoną wersją standardu [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] lub [C ++ 23] itp. .