【发布时间】:2017-03-11 09:07:49
【问题描述】:
在我的应用程序中,我有一个代表“系统” 的单例。此对象首先创建并最后销毁,并且所有其他对象都应该由它管理,这意味着每个对象都将由该 system 对象直接或间接创建(在其run 方法中)并且所有对象都将(希望)在系统变得不可用之前被移除。
问题是对 system 对象的可选访问(通过指针)引入了大量非空检查代码。我知道取消引用空指针会导致未定义的行为。使用旧的 C-assert 是我能做的最好的吗?
// this is mostly pseudo-code, but should compile if
// there is an appropriate MySys header
#include "MySys.h"
class MySysImplementation: public MySys
{
public:
MySysImplementation();
void run();
// ...
};
/// pointing to system object during runtime
namespace {
MySys* g_sys = NULL;
}
MySys& MySys::Instance()
{
assert(g_sys);
return *g_sys;
}
int main()
{
{
MySysImplementation sys;
g_sys = &sys;
sys.run();
} // <---------- HERE all application-specific objects should be gone
g_sys = NULL; // in real code this RAII-ensured
}
【问题讨论】:
-
你也可以抛出异常。在发布模式下可以删除断言。在发布模式下会抛出异常,你可以在某个地方捕获它并在有意义的情况下处理问题。如果不是,您的程序只是终止而没有在无效内存上运行,并且可能格式化您的 PC
-
您是否考虑过将其保留为静态变量?它会将清理工作移出
main,但也许你可以接受。 -
@Hayt 好点,是否有一个异常类可以用于此目的?
-
@krzaq 我更喜欢在 main 中完全控制以逃避 静态初始化噩梦。
-
我不明白它如何既是可选的又是“先创建后销毁”。
标签: c++ pointers reference singleton