指向对象数组的指针需要公共析构函数

时间:2018-09-21 19:54:12

标签: c++

我不明白为什么编译器不允许定义指向动态对象数组的指针,这些对象具有私有析构函数(在此类的实际类或对象之外)。

同时,指向这种动态对象(带有私有析构函数的对象)的指针的定义是完全有效的。

代码示例如下:

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)。

1 个答案:

答案 0 :(得分:4)

想象一下,数组中第二个对象的构造函数失败,那么第一个对象需要销毁。因此,在数组初始化失败的情况下,将在处理编译器的代码中使用析构函数。