代码之家  ›  专栏  ›  技术社区  ›  Josh Weinstein

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

  •  7
  • Josh Weinstein  · 技术社区  · 6 年前

    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;
    };
    

    new[] 使用,如下所示

    Cell* cells = new Cell[5];
    

    Cell being made!
    Cell being made!
    Cell being made!
    Cell being made!
    Cell being made!
    

    后来什么时候 delete[] 是在 cells 指针,我明白了:

    Cell being freed!
    Cell being freed!
    Cell being freed!
    Cell being freed!
    Cell being freed!
    

    我的问题是,在每个构造函数调用中,内存大小是否等于分配的一个类实例?就像你做的那样 new Cell[5] 分配内存5次?或者它只分配一次,然后作为一个函数调用对构造函数进行5次调用?与相同 ,它是否在每次析构函数调用时释放?

    3 回复  |  直到 6 年前
        1
  •  17
  •   taskinoor    6 年前

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

    1. 内存分配/释放
    2. 物体构造/破坏

    new delete 为我们两个都做。

    new Cell[5];

    为5个对象分配内存后, 新的

    类似的事情发生在 delete [] cells

        2
  •  0
  •   SoronelHaetir    6 年前

    如果一个(关键字而不是运算符)new[]成功,它将分配一个足够大的块来容纳所有对象,此时对象将被构造到该块中。

    new和delete(以及new[]和delete[])运算符执行实际的分配/解除分配,并且对于new/new[]和delete/delete[]关键字的任何给定使用都将被调用一次。

        3
  •  0
  •   TaQuangTu    6 年前

    指令 Cell* cells = new Cell[5]; 意味着您在堆区域(主内存)上创建了5个连续的单元对象。而 cells 是位于堆栈区域(主存)上的指向对象的指针( 将只存储第一个对象的地址)。之后,每个对象将调用默认构造函数来初始化它的值,所以您将看到5行 Cell being made! .

    delete [] cells 说明。那么,5个物体 指向将调用5个析构函数在对象从内存中移除之前执行某些操作,但是 细胞 仍然存在于堆栈内存中,可以用来指向另一个单元格对象( 细胞 Cell being freed!