可能重复:
Cannot access private member in singleton class destructor
我正在实施如下单身。
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函数的上下文中调用的。但析构函数不是在同一函数的上下文中调用。这是从全球背景调用的。
答案 0 :(得分: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的析构函数在声明时是可访问的,因此您的示例应该没有错误。