Я могу использовать C ++ 11 или C ++ 14 (или даже C ++ 17). Предположим, у меня есть одноэлементный объект
class MyInstance {
public:
MyInstance() {
throw std::runtime_exception("something went wrong"); // Ctor might throw
}
};
MyInstance& getInstance() {
static MyInstance obj;
return obj;
}
Теперь я убедился, что каждый вызов getInstance
заключен в
try {
auto& inst = getInstance();
} catch(std::runtime_error& e) {
// do something
}
Что меня сейчас интересует, так это: что произойдет, если после сбоя инициализации в конструкторе и выброса и извлечения и информирования пользователя в журналах ... программа снова пропустит в try
кодовом пути и снова вызывает getInstance
?
Я сделал несколько догадок, но понятия не имею, правы ли они:
Объект имеет статическое хранилище, так что его будет пытаться создать только тогда, когда я думаю?
Будет ли возвращение ссылки на неструктурированный объект получит мне висячую ссылку и неопределенное поведение?
Будет ли использовать unique_ptr
в качестве статической переменной вместо obj
, чтобы решить эту проблему, чтобы я мог обращаться к указателю несколько раз, а также проверять, правильно ли построен объект (if (uptr == TRUE)
)?