1
class A
{
private:
    A(){}; 
    ~A(){};
public:
    static A* GetInstance( void )
    {
        static A obj;
        return& obj;
    }
};

我假设如果发生某些bad事情只会在第一次发生,因为类构造函数仅在第一次调用GetInstance发生时才被初始化,我不知道 C++ 的深度,我不信​​任 C++,所以当我需要指向此类的指针,它将在我当前正在执行的函数中多次使用:

A* ptr = A::GetInstance();
if( ptr )
{

检查指针的有效性,我相信该方法返回obj存储值的地址,以便ptr指向它,我猜它can't失败了。

请注意,我不是在谈论一个小型应用程序,我目前正在开发一个 500,000 多行的 MMO 服务器应用程序,该应用程序可以处理数千个客户端,并且必须保持打开数周而不会崩溃,防御性编程是最低要求。是否可以确定100%安全使用ptr而不检查其有效性?

4

3 回答 3

3

该函数当然不可能返回一个空指针,因此没有必要检查它。返回一个引用可能更有意义,以明确它不会为空。

但是,不能保证该函数将始终返回指向有效对象的指针。如果它是从静态对象的析构函数中调用的,那么obj可能已经被销毁了。这就是为什么全局可访问对象是一个非常糟糕的主意的原因之一,无论您是否将它们包装在像这样的 Singleton 反模式中。

于 2012-10-01T02:22:18.690 回答
2

该函数将始终返回一个指向存在的对象的指针。唯一的危险是对象本身无效,这应该由对象构造函数的 throw 指示。在您的情况下,您没有从构造函数中捕获异常,因此程序应该在这种情况下停止,否则应该很好。

检查NULL是没有意义的,因为你总是返回一个有效的地址。

于 2012-10-01T02:21:53.433 回答
1

添加对指针的检查不太可能导致显着的性能下降,但应该是不必要的。如果它会让您感觉更好,请添加它。但是,我更关心缓冲区溢出、内存泄漏和其他更可能的问题,而不是static编译器是否正确实现了关键字。

于 2012-10-01T02:22:59.037 回答