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?

4
iloahz 29 luty 2012, 15:35

3 odpowiedzi

Najlepsza odpowiedź

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;
};
11
hmjd 29 luty 2012, 15:49

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.

1
foxx1337 29 luty 2012, 15:37

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

1
go4sri 29 luty 2012, 15:47