Mã sau đây được biên dịch bằng MSVC9.0 chạy và xuất ra Destructor bốn lần, hợp lý.Tự sát hướng đối tượng hoặc xóa điều này;
#include <iostream>
class SomeClass
{
public:
void CommitSuicide()
{
delete this;
}
void Reincarnate()
{
this->~SomeClass();
new (this) SomeClass;
}
~SomeClass()
{
std::cout << "Destructor\n";
}
};
int main()
{
SomeClass* p = new SomeClass;
p->CommitSuicide();
p = new SomeClass;
p->Reincarnate();
p->~SomeClass(); //line 5
p->CommitSuicide();
}
Tôi nghĩ rằng 4 dòng đầu tiên của mã không chính xác dẫn đến hành vi không xác định (mặc dù không hoàn toàn chắc chắn về điều delete this;
). Tôi muốn có xác nhận hoặc < trình giữ chỗ cho từ trái nghĩa của xác nhận> trong số đó. Nhưng tôi có những nghi ngờ nghiêm trọng về dòng 5 và 6. Nó được phép gọi một cách rõ ràng destructor, phải không? Nhưng liệu cuộc đời của đối tượng được coi là đã kết thúc sau đó? Đó là, là lời gọi của một thành viên khác sau khi cuộc gọi rõ ràng của destructor cho phép (được xác định)?
Để tóm tắt, các phần nào của mã trên (nếu có) dẫn đến hành vi không xác định (nói kỹ thuật)?
Nhưng hàm tạo chỉ được gọi là 3 lần, vậy làm thế nào để gọi hàm hủy 4 lần hợp lý? Nó sẽ đánh bom ngay khi lớp học trở thành thành viên dữ liệu (không tầm thường). – visitor