2012-06-26 12 views

Odpowiedz

8

Funkcje o nazwach 'scalar deleting destructor' i 'vector deleting destructor' są funkcjami pomocniczymi utworzonymi przez kompilator VC podczas generowania kodu dla instrukcji delete. Nie należy mylić ich z destruktorem klasy, który może być również generowany przez kompilator. Były mogą być wyrażone w Pseudokod jak

void scalar_deleting_destructor(A* pa) 
{ 
pa->~A(); 
A::operator delete(pa); 
} 

a drugi jako

void vector_deleting_destructor(A* pa, size_t count) 
{ 
for (size_t i = 0; i < count; ++i) 
pa[i].~A(); 
A::operator delete[](pa); 
} 
+1

Dzięki, Andrey. Jestem nieco zdezorientowany wewnętrznym operatorem usuwania tutaj. Ten skalar usuwający destruktor jest generowany przez kompilator i jest wywoływany przez 'delete a', czy to prawda? Wydaje się, że wewnętrzne wywołanie do usunięcia powoduje rekursję? – Thomson

+3

@Thomson Pozwól, że spróbuję to wyjaśnić. "delete a" to * instrukcja usuwania *, tj. konstrukcja językowa, której nie należy mylić z operatorem 'A :: operator delete', który jest operatorem * * delete, funkcją, która faktycznie zwalnia pamięć. Nie mam w tej chwili dostępnego standardu C++, mógłbym podać referencje nieco później. – Andrey