Có an toàn khi sử dụng longjmp và setjmp trong C++ trên linux/gcc liên quan đến những điều sau không?C++: An toàn để sử dụng longjmp và setjmp?
- xử lý ngoại lệ (tôi không thực hiện xử lý ngoại lệ sử dụng longjmp/setjmp. Tôi muốn biết những gì tác dụng phụ longjmp/setjmp sẽ phải về xử lý ngoại lệ tiêu chuẩn)
*this
con trỏ- Tín hiệu
- Con trỏ thông minh (con trỏ được chia sẻ và xâm nhập của Boost)
- Bất kỳ điều gì khác bạn có thể nghĩ đến.
Bạn có thể giải thích cách longjmp messes với xóa bộ nhớ rõ ràng và destructors? – jameszhao00
Nói chung, bất cứ khi nào có một cách để thoát khỏi phạm vi trong C++ (trả về, ném hoặc bất kỳ thứ gì), trình biên dịch sẽ đặt hướng dẫn để gọi các dtors cho bất kỳ biến tự động nào cần phải bị hủy. 'longjmp()' chỉ nhảy đến vị trí mới trong mã, vì vậy nó sẽ không cung cấp bất kỳ cơ hội nào cho các dtors được gọi. Tiêu chuẩn này thực sự ít cụ thể hơn - tiêu chuẩn không nói rằng các dtors sẽ không được gọi - nó nói rằng tất cả các phiên cược đều bị tắt. Bạn không thể phụ thuộc vào bất kỳ hành vi cụ thể trong trường hợp này. –
Tôi không quá quen thuộc với các con trỏ thông minh. Nếu tôi có một con trỏ thông minh trên stack, khi tôi làm một longjmp không có nghĩa là con trỏ thông minh sẽ không loại bỏ một refcount? Ngoài ra, tôi có an toàn nếu tôi vô hiệu hóa ngoại lệ và viết mã không phát điên với longjmp? – jameszhao00