2011-08-14 36 views
11

Tôi đã thấy tài nguyên hiển thị hai cách phân bổ bộ nhớ trong khi vẫn đảm bảo đủ bộ nhớ để hoàn thành thao tác.cách phân bổ bộ nhớ đúng trong C++ trong điều kiện bộ nhớ thấp

1) quấn hoạt động 'mới' trong một try/catch vì nó sẽ trở std :: bad_alloc (?)

try { ptr = new unsigned char[num_bytes]; } catch(...) {} 

2) kiểm tra con trỏ giao for null sau ca phẫu thuật 'mới' .

ptr = new unsigned char[num_bytes]; if(ptr == NULL) { ... } 

Điều nào đúng? Cả hai đều làm việc? Tôi có cần phải làm cả 1 và 2 không?

Cảm ơn,

jbu

Trả lời

16

Nếu bạn đang sử dụng trình diễn chuẩn của new sẽ ném ngoại lệ, thì trường hợp đầu tiên là chính xác.

Bạn cũng có thể sử dụng một trong những thứ hai nếu bạn sử dụng nothrow như:

ptr = new (nothrow) unsigned char[num_bytes]; 
if(ptr == NULL) { ... } 
+1

oooh đây có lẽ là những gì tôi nên làm thay vào đó, để giảm số lượng mã tôi sẽ cần phải thay đổi. – jbu

+0

@jbu: cũng lưu ý rằng một số mã được biên dịch với các ngoại lệ. Đây không phải là tiêu chuẩn, và trong trường hợp này bạn sẽ cần phải đọc doc trình biên dịch của bạn, nhưng rất có thể là sau đó 'new' sẽ trả về 0 nếu nó không thành công. –

5

phân bổ không thành công [sử dụng new] ném std::bad_aloc, do đó 1 là chính xác.

số 2 được sử dụng cho mã c, khi sử dụng malloc [vì không có ngoại lệ nào trong C, NULL được sử dụng để cho biết phân bổ không thành công].

khi sử dụng new, tuyên bố if sẽ không bao giờ mang lại giá trị đúng, vì nếu phân bổ không thành công - ngoại lệ sẽ bị ném và tuyên bố if sẽ không được truy cập. và tất nhiên khi phân bổ thành công, câu lệnh if sẽ sinh sai.

+2

Lời khuyên tốt nói chung, nhưng nhiều người nhúng C++ nền tảng don' t hỗ trợ ngoại lệ, và đó là những trường hợp bộ nhớ thấp thực sự quan tâm nhiều hơn. –

+0

"nhưng nhiều nền tảng nhúng c + + không hỗ trợ ngoại lệ": thì chúng không hỗ trợ C++, mà là ngôn ngữ giống như C++. Trường hợp ngoại lệ là một phần tiêu chuẩn os C++. – Raedwald

0
try { ptr = new unsigned car[num_bytes]; } 
catch(std::bad_alloc& e) { cerr << "error: " << e.what() << endl; } 

Các thành ngữ thứ hai là thích hợp hơn cho malloc

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