【发布时间】:2019-07-09 09:53:24
【问题描述】:
我可以使用 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))?
【问题讨论】:
-
调用getInstance()两次,将异常信息上报到命令行就很容易发现了。
-
@yeoman 如果怀疑有未定义的行为,则不会。在这种情况下,使用任何代码来检查行为实际上是没有用的。
-
@yeoman - 除非行为未定义,否则这样的实验意义不大。但是要知道它是否未定义,OP 必须在询问之前知道答案。
-
这当然是一个有效的观点^^另一方面,如果静态变量在面对异常时具有未定义的行为,那么很多事情都行不通:)
标签: c++ exception memory-management unique-ptr