class A
{
private:
A(){};
~A(){};
public:
static A* GetInstance( void )
{
static A obj;
return& obj;
}
};
我想假设bad
发生的事情只会在第一次发生,因为类构造函数只在第一次调用GetInstance
时才初始化,我不知道深度很大我不相信C ++,所以当我需要一个指向这个类的指针时,我会在一个函数中多次使用它:
A* ptr = A::GetInstance();
if( ptr )
{
检查指针有效性,我相信该方法返回存储obj
值的地址,以便ptr
指向它,我猜它can't
失败了。
请注意,我不是在谈论一个小应用程序,我目前正在开发一个500,000多行的MMO服务器应用程序,它可以处理数千个客户端并且必须保持打开数周而不会崩溃,防御性编程是最不起眼的需要。 确定, 100%安全使用ptr
而不检查其有效性吗?
答案 0 :(得分:3)
当然,该函数无法返回空指针,因此没有必要检查它。返回引用可能更有意义,以明确它不会为null。
但是,无法保证函数始终返回指向有效对象的指针。如果从静态对象的析构函数调用它,则obj
可能已经被销毁。这就是为什么全局可访问对象是一个非常糟糕的想法的一个原因,无论你是否将它们包装在像这样的Singleton反模式中。
答案 1 :(得分:2)
该函数将始终返回指向存在的对象的指针。唯一的危险是如果对象本身是无效的,这应该是由对象构造函数的抛出指示的。在你的情况下,你没有从构造函数中捕获异常,所以在这种情况下程序应该停止,否则它应该是好的。
检查NULL
是没有意义的,因为您总是返回一个有效的地址。
答案 2 :(得分:1)
添加对指针的检查不太可能导致性能显着下降,但应该是不必要的。添加它,如果它会让你感觉更好。但是,我会更关心缓冲区溢出,内存泄漏以及其他更可能的问题,而不是编译器是否正确实现了static
关键字。