2011-09-26 23 views
6

Có mã như:điều hành mới với tùy chọn nothrow vẫn ném ngoại lệ

#include <iostream> 

int main(){ 
    for(;;){ 
     int* ptr = new (std::nothrow) int; 
     if(ptr == 0){ 
      std::cout << 0 << std::endl; 
      break; 
     } 
    } 
    std::cin.get(); 
    return 0; 
} 

Tuy nhiên, chương trình này vẫn ném std :: bac_alloc ngoại lệ, altough mới được gọi với std :: nothrow tham số. Chương trình này được biên dịch trong Visual C++ 2010. Tại sao ngoại lệ được ném?

Chỉnh sửa:

Sử dụng g ++ trên Windows từ mingw, mọi thứ hoạt động tốt.

+0

Chương trình này không được biên dịch. Thật đáng tiếc. Bạn nên thêm '#include '. Dù sao, bạn đang sử dụng phiên bản VC++ nào? –

+0

Vâng, nó có. Phiên bản từ năm 2010. – scdmb

+0

Nó cũng biên dịch trên gcc. Cái quái gì khiến tôi tin rằng nó sẽ là một ý tưởng tốt để thực sự chạy nó? – pmr

Trả lời

1

Tôi vừa chạy mẫu của bạn từ VC2010. Nó không phải là mới (nothrow) mà ném, nhưng __security_check_cookie.

+0

Hmm, dường như là lỗi trình biên dịch. – MSalters

-2

This giải thích lý do tại sao nó vẫn còn ném và cách bạn có thể làm cho nó không ném. Có vẻ như nothrow chỉ bị bỏ qua.

Nếu bạn vẫn muốn có phiên bản không mới của Thư viện thời gian chạy C, hãy liên kết chương trình của bạn với nothrownew.obj. Tuy nhiên, khi bạn liên kết với nothrownew.obj, mới trong Thư viện chuẩn C++ sẽ không còn hoạt động nữa.

Tôi đã tìm thấy một bài viết khá sâu về điều này nhưng nó đã lỗi thời (VC 6) nhưng có thể sự cố vẫn tiếp diễn. BTW VC bỏ qua tất cả các thông số kỹ thuật của throw().

When Operator new(std::nothrow) Throws an Exception Anyway

+0

Trang đó dường như nói về toán tử "bình thường" mới' ('mới X' trái ngược với' mới (std :: nothrow) X'), trong khi câu hỏi đặc biệt về sau. – NPE

+0

Điều đó đề cập cụ thể đến "thông thường" mới '. Xem http://blogs.msdn.com/b/stevejs/archive/2005/11/01/487776.aspx để được giải thích. – MSalters

7

0 phải được định dạng như "0". Điều đó sẽ mất một vài byte; Tôi sẽ đặt cược đó là nguyên nhân. Đặt một breakpoint trên std::bad_alloc::bad_alloc và bạn sẽ biết chắc chắn.

+0

Hoặc đặt một khối try-catch xung quanh điều mới và một khối try-catch xung quanh toàn bộ chức năng để biết nếu nó thực sự là 'mới' mà không thành công hay không. –

+1

Thậm chí tốt hơn, hãy kiểm tra tùy chọn để phá vỡ một ngoại lệ C++ đang được ném. –

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