Qubc
@Qubc
Ненавижу полисемию.

Почему в ассемблерном листинге gcc нет тела деструктора [complete object destructor]? Как его находит линкер?

class Object { 
  public:
  virtual ~Object (void); 
};

Object::~Object (void) { 
  int var = 555; var++; 
}

int main() {
  Object o;
  return 0;
}


Object::~Object() [base object destructor]:
  mov edx, OFFSET FLAT:vtable for Object+16
  ret

Object::~Object() [deleting destructor]:
  call Object::~Object() [complete object destructor]
  call operator delete(void*)
  ret

Object::Object() [base object constructor]:
  mov edx, OFFSET FLAT:vtable for Object+16
  ret

main:
  call Object::Object() [complete object constructor]
  call Object::~Object() [complete object destructor]
  ret

vtable for Object:
  .quad Object::~Object() [complete object destructor]
  .quad Object::~Object() [deleting destructor]


Было бы логично увидеть, что происходит вызов deleting dtor внутри которого происходит вызов base object dtor.
  • Вопрос задан
  • 68 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Было бы логично увидеть, что происходит вызов deleting dtor внутри которого происходит вызов base object dtor.

было бы логично, если бы ты вызывал delete для объекта. А для объекта на стеке-то зачем delete?

Почему в ассемблерном листинге gcc нет тела деструктора [complete object destructor]?

Есть, просто у тебя какой-то понтовый листинг и ты его не видишь. А из-под gcc -S для твоего кода выходит ассемблерный текст, в котором есть такие строчки:
.globl  _ZN6ObjectD1Ev
.set    _ZN6ObjectD1Ev,_ZN6ObjectD2Ev
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы