2013-06-04 10 views
5

Jak stwierdzono w tytule, tutaj jest mój kod:Jaka jest różnica między usunąć i wzywającą destruktora w C++

class Foo { 

    public: 
     Foo (int charSize) { 
      str = new char[charSize]; 
     } 
     ~Foo() { 
      delete[] str; 
     } 
    private: 
     char * str; 
}; 

Dla tej klasy, co byłoby różnicy między:

int main() { 
    Foo* foo = new Foo(10); 
    delete foo; 
    return 0; 
} 

i

int main() { 
    Foo* foo = new Foo(10); 
    foo->~Foo(); 
    return 0; 
} 
+0

Powinieneś nigdy nie mieć powodu, aby wywoływać destruktor jawnie, z wyjątkiem kilku sytuacji, w których będziesz wiedział, że musisz. – chris

+0

@chris Takich jak praca wokół braku miejsca docelowego Usuń: http://stackoverflow.com/questions/6783993/placement-new-and-delete –

+0

@ScottJones, Dokładnie. – chris

Odpowiedz

10

Wywołanie destruktora powoduje zwolnienie zasobów należących do obiektu, ale nie zwalnia pamięci przydzielonej do obiektu. sam obiekt. Drugi fragment kodu ma wyciek pamięci.

0

Za każdym razem, gdy wywoływane jest wywołanie destruktora, przydzielona pamięć obiektu nie jest zwolniona, ale obiekt nie jest już dostępny w programie. Ale usuń całkowicie usuwa obiekt z pamięci.

Powiązane problemy