我不明白为什么编译器不允许定义指向动态对象数组的指针,这些对象具有私有析构函数(在此类的实际类或对象之外)。
同时,指向这种动态对象(带有私有析构函数的对象)的指针的定义是完全有效的。
代码示例如下:
class P
{
public:
P()
{
std::cout << "Construct P" << "\n";
}
static P * GetStatic10()
{
return new P[10]; // Compiled fine.
}
P * Get10()
{
return new P[10]; // Compiled fine.
}
private:
~P()
{
std::cout << "Destroy P" << "\n";
}
};
int main()
{
P *p1_0 = new P(); // Compiled fine.
P *p2 = new P[10]; // Compile error: "Calling a private destructor of class 'P'".
return 0;
}
为澄清起见,问题是关于以下代码行:P *p2 = new P[10];
。
注意:已在Xcode 10.0中编译(默认编译器:Apple Clang)。
答案 0 :(得分:4)
想象一下,数组中第二个对象的构造函数失败,那么第一个对象需要销毁。因此,在数组初始化失败的情况下,将在处理编译器的代码中使用析构函数。