2012-08-12 32 views
8

Nếu tôi hiểu chính xác, khi shared_ptr (từ boost, tr1, std, bất cứ điều gì) được khởi tạo với một con trỏ tới đối tượng mới được phân bổ, hàm tạo của shared_ptr cấp phát một lượng bộ nhớ nhỏ để giữ số tham chiếu cho con trỏ quản lý. Điều gì xảy ra nếu phân bổ đó không thành công? Trong mã sau đây:Điều gì sẽ xảy ra nếu một hàm tạo của shared_ptr bị lỗi?

class my_class {}; 
void my_func(shared_ptr<my_class> arg); 

int main(int argc, char* argv[]) 
{ 
    my_func(shared_ptr<my_class>(new my_class())); 
    return 0; 
} 

... sẽ là đối tượng my_class bị rò rỉ nếu shared_ptr không cấp phát bộ nhớ cho số tham chiếu của nó? Hay constructor của shared_ptr có chịu trách nhiệm xóa đối tượng không?

Trả lời

7

Mã của bạn sẽ không bị rò rỉ đối tượng my_class, ngay cả khi shared_ptr không thể cấp phát bộ nhớ.

Theo tiêu chuẩn C++ 11 (20.7.2.2.1), trong constructor shared_ptr:

Ném: bad_alloc, hoặc một thực hiện-de fi ngoại lệ ned khi một nguồn tài nguyên khác so với bộ nhớ không thể thu được.

An toàn ngoại lệ: Nếu ngoại lệ được ném, hãy xóa p được gọi.

Trong phiên bản hàm tạo một dấu phân cách do người dùng xác định, dấu phân cách sẽ được sử dụng thay thế.

Boost documentation chỉ định giống nhau.

+0

Chúc mừng. Tôi đã kích hoạt Google nhưng không tìm thấy câu trả lời. Một trong những ngày này tôi sẽ học cách kiểm tra nguồn - tức là tiêu chuẩn. :-) – bythescruff

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