8

可能重复:
无法访问单例类析构函数中的私有成员

我正在实现一个单例,如下所示。

class A
{
public:

    static A& instance();
private:
    A(void)
    {
        cout << "In the constructor" << endl;
    }
    ~A(void)
    {
        cout << "In the destructor" << endl;
    }

};

A& A::instance()
{
    static A theMainInstance;
    return theMainInstance;
}

int main()
{
    A& a = A::instance();

    return 0;
 }

析构函数是私有的。当程序即将终止时,会为对象 theMainInstance 调用它吗?

我在 Visual Studio 6 中试过这个,它给出了一个编译错误。

"cannot access private member declared in class..."

在 Visual Studio 2010 中,它被编译并调用了析构函数

根据标准,这里的期望应该是什么?

编辑:由于 Visual Studio 6 的行为不是那么愚蠢,因此出现了混淆。可以说,静态对象的 A 的构造函数是在 A 的函数上下文中调用的。但析构函数不是在同一个函数的上下文中调用的。这是从全局上下文中调用的。

4

1 回答 1

4

C++03 标准的第 3.6.3.2 节说:

Destructors for initialized objects of static storage duration (declared at block scope or at namespace scope) are called as a result of returning from main and as a result of calling exit.

它对拥有私有析构函数没有任何限制,因此基本上如果它被创建,它也会被销毁。

私有析构函数确实会限制声明对象的能力 (C++03 12.4.10)

A program is ill-formed if an object of class type or array thereof is declared and the destructor for the class is not accessible at the point of declaration

但是由于 A::theMainInstance 的析构函数可以在声明时访问,因此您的示例应该没有错误。

于 2012-07-17T14:20:01.043 回答