new []和delete []多少次调用分配和释放内存?

Jos*_*ein 7 c++ memory constructor allocation

C++,每次new []使用或delete []使用时,每个人分配或释放内存的次数是多少?我的问题更具体地说是在具有各自构造函数和析构函数的类上使用它们.

如,采取以下课程:

#include <iostream>

class Cell
{
public:
    Cell() : _value(2)
    {
        std::cout << "Cell being made!\n";
    }
    ~Cell()
    {
        std::cout << "Cell being freed!\n";
    }

    const int& getVal() const
    {
        return _value;
    }
private:
    int _value;
};
Run Code Online (Sandbox Code Playgroud)

现在,假设需要一个类类型的数组,并new[]使用,如下所示

Cell* cells = new Cell[5];
Run Code Online (Sandbox Code Playgroud)

当在可执行文件或程序中运行时,我也看到以下打印到stdout:

Cell being made!
Cell being made!
Cell being made!
Cell being made!
Cell being made!
Run Code Online (Sandbox Code Playgroud)

随后当指针delete[]被调用时cells,我看到:

Cell being freed!
Cell being freed!
Cell being freed!
Cell being freed!
Cell being freed!
Run Code Online (Sandbox Code Playgroud)

我的问题是,在每个构造函数调用中,内存的大小是否等于分配的一个类实例?比如new Cell[5]分配内存5次?或者它只分配一次,然后对构造函数进行5次调用,只是函数调用?与delete[]每个析构函数调用时解除分配相同吗?

tas*_*oor 17

你混合了两个不同的概念:

  1. 内存分配/释放
  2. 对象构造/破坏

newdelete为我们做两件事.

new Cell[5];

所有5个对象所需的总内存在单个内存分配操作中分配.它不能是5个分配,因为5个不同的分配不能保证连续的空间.

为5个对象分配内存后,new必须通过调用默认构造函数初始化5个对象.这里我们有5个单独的构造函数调用.

类似的事情发生在delete [] cells.它必须通过调用5个不同对象的析构函数来销毁5个对象.然后在一次单独的释放操作中释放所有分配的内存.