Và objdump
tệp .o của tôi cho thấy rằng tôi có hai trình phá hủy khác nhau cho cùng một lớp. Tại sao?Tại sao tôi có hai triển khai destructor trong đầu ra lắp ráp của tôi?
Disassembly of section .text._ZN1AD0Ev:
0000000000000000 <_ZN1AD0Ev>:
0: 53 push %rbx
1: be 00 00 00 00 mov $0x0,%esi
6: 48 89 fb mov %rdi,%rbx
9: 48 c7 07 00 00 00 00 movq $0x0,(%rdi)
10: ba 2c 00 00 00 mov $0x2c,%edx
15: bf 00 00 00 00 mov $0x0,%edi
1a: e8 00 00 00 00 callq 1f <_ZN1AD0Ev+0x1f>
1f: 48 89 df mov %rbx,%rdi
22: be 08 00 00 00 mov $0x8,%esi
27: 5b pop %rbx
28: e9 00 00 00 00 jmpq 2d <_ZN1AD0Ev+0x2d>
Disassembly of section .text._ZN1AD2Ev:
0000000000000000 <_ZN1AD1Ev>:
0: 48 c7 07 00 00 00 00 movq $0x0,(%rdi)
7: ba 2c 00 00 00 mov $0x2c,%edx
c: be 00 00 00 00 mov $0x0,%esi
11: bf 00 00 00 00 mov $0x0,%edi
16: e9 00 00 00 00 jmpq 1b <_ZN1AD1Ev+0x1b>
Đây là các lớp trong file header mà kết quả trong mã này được tạo ra:
#include <iostream>
class A {
public:
virtual ~A() {
::std::cout << "This destructor does something significant.\n";
}
};
class B : public A {
public:
inline virtual ~B() = 0;
};
B::~B() = default;
class C : public B {
public:
inline virtual ~C() = default;
};
Bạn có thể dán lớp thực tế không? –
Nhiều trình biên dịch tạo ra hai trình phá hủy khác nhau cho một lớp: một để phá hủy các đối tượng được cấp phát động, một đối tượng khác để hủy các đối tượng không động (các đối tượng tĩnh hoặc địa phương hoặc các đối tượng con). Các cựu gọi 'nhà điều hành xóa' từ bên trong, sau này không. Một số trình biên dịch làm điều đó bằng cách thêm một tham số ẩn cho một destructor (phiên bản cũ của GCC làm điều đó), một số trình biên dịch chỉ đơn giản là tạo ra hai destructors riêng biệt (phiên bản mới hơn của GCC làm điều đó). Xem, ví dụ: tại đây https://stackoverflow.com/questions/7199360/what-is-the-branch-in-the-destructor-reported-by-gcov/7199706#7199706. – AnT
@AnT Nghe như một câu trả lời! – Omnifarious