Hãy xem xét đoạn mã sau:Điều gì đang xảy ra trong khi xóa câu lệnh `delete this; '?
class foo
{
public:
foo(){}
~foo(){}
void done() { delete this;}
private:
int x;
};
gì đang xảy ra (và nó là hợp lệ?) Trong hai tùy chọn sau:
tùy chọn 1:
void main()
{
foo* a = new foo();
a->done();
delete a;
}
phương án 2:
void main()
{
foo a;
a.done();
}
Câu lệnh thứ hai là delete a;
khi chọn ion 1 sẽ gây ra một ngoại lệ hoặc tham nhũng đống?
Tùy chọn2 có gây ra ngoại lệ hoặc tham nhũng heap không?
Bạn có quên dấu ngoặc mở cho lớp do nhầm lẫn hay chính xác là mã được sao chép không? – Neophile
@Nerds: một lỗi đánh máy - cố định ... – NirMH
Thú vị. Tôi đoán đầu tiên sẽ gây ra một segfault hoặc heap tham nhũng, và thứ hai sẽ làm bất cứ điều gì xóa một con trỏ vào ngăn xếp không. – cha0site