Что за дополнительный параметр передается в виртуальный деструктор? - PullRequest
14 голосов
/ 08 ноября 2011

У меня есть этот код:

class Class {
public:
    virtual ~Class() {}
};

int main()
{
    Class* object = new Class();
    delete object;
}

, который я компилирую с Visual C ++ 10 и получаю эту разборку для оператора delete object:

delete object;
test        eax,eax  
je          wmain+23h (401041h)  
mov         edx,dword ptr [eax]  
push        1  
mov         ecx,eax  
call        dword ptr [edx]

и это для фактического деструктора:

Class::`scalar deleting destructor':
test        byte ptr [esp+4],1  
push        esi  
mov         esi,ecx  
mov         dword ptr [esi],offset Class::`vftable' (402100h)  
je          Class::`scalar deleting destructor'+18h (401018h)  
push        esi  
call        dword ptr [__imp_operator delete (4020A8h)]  
pop         ecx  
mov         eax,esi  
pop         esi  
ret         4

Что push 1 делает на месте вызова и почему test в точке входа деструктора проверяет это значение и условно обходит вызов operator delete()?

Ответы [ 3 ]

14 голосов
/ 08 ноября 2011

Аргумент используется деструктором, чтобы узнать, должен ли он вызвать delete в конце.

3 случая, когда вы не хотите называть это:

  • Деструктор вызывается деструктором производного класса
  • Объект размещен в стеке, поэтому не создается с новым.
  • Объект является полем другого объекта, поэтому не создается новым

РЕДАКТИРОВАТЬ: Добавить третий случай

5 голосов
/ 08 ноября 2011

По сути, виртуальный деструктор также реализует оператор удаления вызова. Параметр предназначен для определения, вызывать его или нет.

См. этот ответ, который показывает значение такого скрытого параметра деструктора .

5 голосов
/ 08 ноября 2011

Я полагаю, что дополнительный параметр сообщает компилятору, какой деструктор является самым производным, так что он освобождает память только один раз на соответствующем уровне наследования. Я видел нечто подобное в gcc, если я правильно помню.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...