class A
{
public:
A() { printf("constructor"); };
private:
~A() {};
};
int main(int argc, char** argv[])
{
void *p = new A(); //ok
void *p = new A[5]; //error
return 0;
}
我只想在堆中创建对象(也就是说,仅通过new
创建对象,因此我将默认析构函数设置为private
。但是,当我使用new A()
仅创建一个对象时,该方法有效,而当我使用new A[5]
时,则无效。为什么?我很困惑。非常感谢!
答案 0 :(得分:8)
执行new A[5]
涉及的步骤是:
如果在上述第二步中引发了异常,则需要执行以下操作:
因此,new []
实现需要能够访问该类的析构函数。
答案 1 :(得分:2)
尝试此替代方法。它不仅在堆上分配对象,而且在数组上分配:
[EDIT] 感谢@MM的建议,我可以写出一种更好的方法:不使用通用指针并为每个分配声明适当的指针类型,那么代码将大大简化:
#include <cstdio>
class A
{
public:
A() { printf("constructor"); };
private:
~A() {};
};
int main(int argc, char *argv[])
{
A *p1 = new A(); // ok. not using generic pointer
A **p2 = new A*[5]; // no error anymore, also there's not a generic pointer involved
for (int i = 0; i < 5; ++i) {
p2[i] = new A();
}
return 0;
}