Tôi tự hỏi, không có mục đích nào khác ngoài sự tò mò thuần khiết (vì không ai nên viết mã như thế này!) Về cách hành vi của RAII mắt lưới với việc sử dụng goto (ý tưởng đáng yêu phải không) .Điều gì xảy ra khi chúng tôi kết hợp RAII và GOTO?
class Two
{
public:
~Two()
{
printf("2,");
}
};
class Ghost
{
public:
~Ghost()
{
printf(" BOO! ");
}
};
void foo()
{
{
Two t;
printf("1,");
goto JUMP;
}
Ghost g;
JUMP:
printf("3");
}
int main()
{
foo();
}
Khi chạy mã sau trong Visual Studio 2005, tôi nhận được kết quả sau.
1,2,3 BOO!
Tuy nhiên tôi tưởng tượng, đoán, hy vọng rằng 'BOO!' sẽ không thực sự xuất hiện như là Ghost nên chưa bao giờ được khởi tạo (IMHO, vì tôi không biết hành vi mong đợi thực tế của mã này).
Có chuyện gì?
Tôi chỉ nhận ra rằng nếu tôi nhanh chóng một nhà xây dựng rõ ràng cho Ghost mã không biên dịch ...
class Ghost
{
public:
Ghost()
{
printf(" HAHAHA! ");
}
~Ghost()
{
printf(" BOO! ");
}
};
Ah, những bí ẩn ...
Tôi tin rằng hành vi là chính xác. Nếu không, làm thế nào bạn có thể tham khảo biến g sau khi JUMP? – leiz
http://xkcd.com/292/ –