2013-04-18 23 views
10

Một đồng nghiệp đã khăng khăng sử dụng Singleton của Meyer cho tất cả các biến con trỏ toàn cục là "không có gì đảm bảo việc xây dựng toàn cầu unique_ptr sẽ không bị ném". Vì vậy, thay vì:Khi nào cần thay thế một tiêu chuẩn toàn cục :: unique_ptr với một singleton

#include <memory> 

std::unique_ptr<Foo> ptr(nullptr); // Apparently this isn't safe. 

int main(/*blah*/) 
{ 
    ptr.reset(new Foo()); 
} 

Bây giờ chúng ta có

unique_ptr<Foo> singleton 
{ 
    try 
    { 
     static unique_ptr<Foo> ptr(); 
     return ptr; 
    } 
    catch (...) 
    { 
     std::cerr << "Failed to create single instance\n"; 
     exit(1); 
    } 
    return unique_ptr<Type>(); 
} 

int main() 
{ 
} 

Đối với tôi điều này dường như là một giải pháp tìm kiếm một vấn đề. Anh ta có điểm không?

+1

Ngoài ra, tôi sẽ lập luận rằng bắt ngoại lệ, và sau đó thực hiện một lối ra (và loại bỏ bất kỳ cơ hội nào để tìm ra lý do tại sao nó thất bại), có vẻ như là một ý tưởng tồi tệ hơn. Hầu hết các hệ thống, một ngoại lệ unhandled chấm dứt và tạo ra đầu ra gỡ lỗi (chẳng hạn như một tệp lõi). –

Trả lời

21

Đồng nghiệp của bạn không chính xác (hoặc có lẽ chỉ lỗi thời, các phiên bản chuẩn của unique_ptr có thể khác nhau). Các nhà xây dựng nullptr_t của unique_ptr được đảm bảo không để ném (20.7.1.2):

constexpr unique_ptr (nullptr_t) noexcept : unique_ptr() {} 

Kể từ khi nó cũng constexpr (và kể từ nullptr là một biểu thức hằng), nó là cần thiết để được khởi tạo trong quá trình khởi hằng số (3.6.2/2). Vì vậy, kiểm soát trật tự khởi tạo (lý do khác Meyleton singleton có thể hữu ích) cũng không áp dụng ở đây.

+0

Tất cả các ctors 'unique_ptr' đều không có ngoại lệ. 'constexpr' ctor cho phép khởi tạo trong _constant initialization_, một phần của _static initialization_, được thực hiện trước * bất kỳ * _dynamic initialization_ nào. – dyp

+0

@DyP: chỉ cho phép hoặc yêu cầu? –

+1

Cho phép, có thêm các yêu cầu cho init được thực hiện trong quá trình khởi tạo _constant_, xem [basic.start.init]/2 – dyp

2

"không có bảo đảm việc xây dựng các unique_ptr toàn cầu sẽ không ném"

Và nếu nó ném, những gì sẽ xảy ra? Ứng dụng được chấm dứt, mặc dù tiêu chuẩn không chỉ định nếu ngăn xếp được unwound nếu bạn không bắt ngoại lệ (như là một biến toàn cầu, không có nơi để bắt ngoại lệ). Tôi không rõ giải pháp đề xuất là một sự cải thiện rõ ràng về điều đó.

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