2010-08-02 30 views
7

thể trùng lặp:
Will new return NULL in any case?Toán tử mới có trả về NULL không?

Giả sử tôi có một xe đẳng cấp và tôi tạo ra một đối tượng

Car *newcar = new Car(); 
if(newcar==NULL) //is it valid to check for NULL if new runs out of memory 
{ 
} 
+2

Bản sao của [Sẽ trả về NULL mới trong mọi trường hợp?] (Http://stackoverflow.com/questions/550451/will-new-return-null-in-any-case) –

Trả lời

28

Trên một ++ thực hiện các tiêu chuẩn phù hợp C, không có. Dạng thông thường của new sẽ không bao giờ trả lại NULL; nếu phân bổ không thành công, một ngoại lệ std::bad_alloc sẽ bị ném (biểu mẫu new (nothrow) không ném ngoại lệ và sẽ trả lại NULL nếu không phân bổ được).

Trên một số trình biên dịch C++ cũ hơn (đặc biệt là các ngôn ngữ được phát hành trước khi ngôn ngữ được chuẩn hóa) hoặc trong trường hợp ngoại lệ bị vô hiệu hóa một cách rõ ràng (ví dụ, có lẽ một số trình biên dịch cho hệ thống nhúng), new có thể trả về lỗi NULL. Các trình biên dịch thực hiện điều này không phù hợp với tiêu chuẩn C++.

+0

Chính xác! Cách để làm điều đó trong C++ là với các khối try/catch. Dưới đây là ví dụ: http://www.cplusplus.com/reference/std/new/bad_alloc/ – karlphillip

2

Theo mặc định C++ ném std :: bad_alloc exception khi toán tử mới không thành công. Do đó, không cần phải kiểm tra NULL trừ khi bạn đã vô hiệu hóa việc sử dụng ngoại lệ một cách rõ ràng.

+0

... và nếu bạn tắt sử dụng ngoại lệ, thì ngôn ngữ không còn là C++ nữa. –

8

Không, new ném std::bad_alloc về lỗi phân bổ. Sử dụng new(std::nothrow) Car thay vào đó nếu bạn không muốn ngoại lệ.

1

Tôi đã nhìn thấy điều này nhiều lần và tự hỏi tại sao như mới sẽ ném một ngoại lệ bộ nhớ. Tôi đoán nó đến từ các nhà phát triển đã từng làm việc trong C và giờ là C++.

+0

Ý của bạn là gì? Nó đã không ném một ngoại lệ trong C, và tôi không chắc chắn hành vi nào bạn nghĩ là hợp lý nếu không phải của những người. – Chuck

+4

"Kiểm tra giá trị rỗng", tôi nghĩ anh ta có ý nghĩa. –

+0

"kiểm tra cho null" phản xạ gag rộng rãi chắc chắn là lý do tại sao một số lập trình viên VC6 thực hiện 'mới' vào thời điểm đó, quyết định trả về NULL là một điều hợp lý để làm. có lẽ malloc đã làm điều đó và kể từ khi mới chỉ cần kết thúc tốt đẹp malloc ... –