Мой код: < /p>
#include
#include
#include
class Base
{
public:
Base(uint32_t len)
: len_(len)
{
buf_ = (char *)malloc(len_ * sizeof(char));
}
virtual ~Base()
{
if (nullptr != buf_)
{
free(buf_);
buf_ = nullptr;
}
}
void set_buf(const char *str)
{
if (nullptr != str && nullptr != buf_ && len_ > 0)
{
strncpy(buf_, str, len_);
buf_[len_ - 1] = '\0';
}
}
private:
uint32_t len_;
char *buf_;
};
int main(int argc, char *argv[])
{
Base base(8);
base.set_buf("hello");
return 0;
}
< /code>
i скомпилировал его, используя g ++ -g -o0 -fno -inline -std = c ++ 11 -wall main.cpp -o main < /code>.
Далее я использовал objdump -s main < /code>, чтобы посмотреть на код сборки: < /p>
0000000000001250 :
virtual ~Base()
1250: f3 0f 1e fa endbr64
1254: 55 push %rbp
1255: 48 89 fd mov %rdi,%rbp
}
1258: e8 d3 ff ff ff call 1230
Как показано выше, вы можете увидеть, что _zn4based0ev (т.е. удаление деструктора) _zn4based1ev (т.е. полное разрушение объекта).
Однако, когда я отлаживаю основное с GDB, я вижу, что _zn4bed0ev Code a Dangug с gdb, я вижу, что _zn4bed0ev Codegaug. _Zn4based2ev (т.е. деструктор базового объекта) и, действительно, это _zn4based2ev в vtable, а не _zn4based1ev .
(gdb) disassemble _ZN4BaseD0Ev
Dump of assembler code for function _ZN4BaseD0Ev:
0x0000555555555250 : endbr64
0x0000555555555254 : push %rbp
0x0000555555555255 : mov %rdi,%rbp
0x0000555555555258 : call 0x555555555230
0x000055555555525d : mov %rbp,%rdi
0x0000555555555260 : mov $0x18,%esi
0x0000555555555265 : pop %rbp
0x0000555555555266 : jmp 0x5555555550a0
End of assembler dump.
< /code>
(gdb) x/4ag 0x555555557d78 - 16
0x555555557d68 : 0x0 0x555555557d88
0x555555557d78 : 0x555555555230 0x555555555250
< /code>
I'd like to know what causes this discrepancy and what the real situation is (does _ZN4BaseD0Ev на самом деле вызов _zn4based1ev или _zn4based2ev )?
my Environment info:
$ uname -a
Linux xxx 5.15.0-127-generic #137-Ubuntu SMP Fri Nov 8 15:21:01 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
$ g++ --version
g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
$ gdb --version
GNU gdb (Ubuntu 12.1-0ubuntu1~22.04.2) 12.1
Подробнее здесь: https://stackoverflow.com/questions/795 ... nd-objdump
Непоследовательные деструкторы, как видно GDB и Objdump ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Objdump — как создать исходный код для библиотечных функций на выходе сборки
Anonymous » » в форуме C++ - 0 Ответы
- 38 Просмотры
-
Последнее сообщение Anonymous
-