2010-11-30 66 views
5

Điều gì sẽ là trạng thái của một con trỏ đối tượng khi một hàm tạo lớp mới ném một ngoại lệ trong C++? Hãy lấy đoạn mã sau, ví dụ:Trạng thái con trỏ đối tượng Sau khi phát hiện ra constructor ném ngoại lệ - C++

CMyClass * pobjMyClass = (CMyClass *)0xA5A5A5A5; 

try 
{ 
    pobjMyClass = new CMyClass(); // Exception thrown in constructor 
} 
catch (...) {} 

Khi mã này thực thi giá trị của pobjMyClass là gì, sau khi ngoại lệ được ném? Một con trỏ đến một phiên bản không hợp lệ của CMyClass, 0xA5A5A5A5, NULL, một số giá trị ngẫu nhiên chưa được khởi tạo, hoặc một cái gì đó khác? Cảm ơn.

+0

Chắc chắn bạn đã thử điều này? – TonyK

+2

@TonyK, việc thử mọi thứ chỉ cung cấp một nửa câu trả lời - cách hoạt động trên * trình biên dịch * của bạn. Nó thường hữu ích để biết làm thế nào nó hoạt động phổ quát. C++ đầy những cạm bẫy, và thật tốt khi thận trọng. –

+0

Mặc dù vậy, Mark - chắc chắn Jim đã dùng thử? Chuyện gì đã xảy ra? – TonyK

Trả lời

6

Vì ngoại lệ được ném trước khi chuyển nhượng diễn ra, pobjMyClass sẽ là bất kỳ điều gì trước đây - trong trường hợp của bạn là 0xa5a5a5a5.

+0

+1 xóa của tôi vì bạn thực sự có câu trả lời đúng đầu tiên :) –

+0

Vâng, về mặt kỹ thuật, tôi đã đăng một câu trả lời mới ngay cả khi bạn được chú thích trong các nhận xét và hoàn toàn ổn sau khi chỉnh sửa. Nhưng cảm ơn :) – EboMike

+4

Để chính xác hơn, có một điểm chuỗi tại lối ra của hàm tạo, nghĩa là tác dụng phụ của phép gán không thể xảy ra trước khi hàm tạo trả về. Vì hàm tạo không trả về, nhiệm vụ không bao giờ xảy ra. – aschepler

Các vấn đề liên quan