【问题标题】:c++ arrays and dynamic memory [duplicate]c ++数组和动态内存[重复]
【发布时间】:2011-07-13 18:26:40
【问题描述】:

可能重复:
How does delete[] know it's an array? (C++)
How does delete[] “know” the size of the operand array?

假设我们有以下类

class Data
{
public:
    Data() : i(new int) { *i = 0; }
    ~Data() { delete i; }

private:
    int *i;
};

现在我们创建包含 100 个数据类型元素的数组

Data* dataArray = new Data[100];

我们知道 operator new 将为 100 个对象调用 Data 构造函数,因为它知道创建了多少个对象,现在让我们删除这个数组,如果我们说 delete dataArray 将只调用第一个对象的析构函数,即使我们知道我们被释放的 100 个对象的内存 - 将导致内存泄漏 - 因为它们被分配为一个块,但如果我们说 delete[] dataArray 将调用 100 个对象的析构函数,但这是一个动态内存,我没有t 指定其中有多少对象,据我所知,数组没有开销来知道其中有多少对象,那么运行时环境如何知道在释放内存之前要销毁的对象数量?

【问题讨论】:

标签: c++ delete-operator


【解决方案1】:

首先,delete dataArray 是非法的。它可能破坏第一个对象。它可能什么都不做。它可能会崩溃。它可能会通过你的鼻子召唤恶魔。不要这样做。

至于delete []如何确定要存储多少元素,这取决于C++库的实现。通常在第一个元素之前有一个元素计数(这可能是始终与动态分配相关联的元数据的一部分,或者它可能是为delete [] 添加的额外数据); delete [] 实现将查看此计数以确定调用析构函数的次数;然后它会在实际释放内存之前调整指针指向元素计数之前(这是delete dataArray 可能会严重中断的原因之一)。

【讨论】:

    【解决方案2】:

    这取决于编译器的作用,但基本上有 2 个选项:

    • 在实际对象(数组大小、分配大小)之前存储数据,a la malloc
    • 保留与数组大小关联的指针的全局映射。

    【讨论】:

      【解决方案3】:

      这就是为什么您需要在每种特定情况下使用operator deleteoperator delete[]。它们不可互换并且它们做不同的事情。该实现保留了有关这些运算符使用的每个内存块的一些编译器/库特定的簿记信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-27
        • 2014-04-12
        • 2011-01-27
        • 2012-09-10
        • 1970-01-01
        • 1970-01-01
        • 2021-09-20
        • 2012-09-28
        相关资源
        最近更新 更多