仅在堆中创建C ++对象

时间:2018-07-20 02:38:28

标签: c++ class stack heap

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]时,则无效。为什么?我很困惑。非常感谢!

2 个答案:

答案 0 :(得分:8)

执行new A[5]涉及的步骤是:

  1. 分配所需的内存量。
  2. 使用默认构造函数初始化每个对象。
  3. 返回指向已分配内存的指针。

如果在上述第二步中引发了异常,则需要执行以下操作:

  1. 在所有已初始化的对象上调用析构函数。
  2. 释放内存。
  3. 处理例外。

因此,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;
}