c ++数组和动态内存

Muh*_*mad 2 c++ delete-operator

可能重复:
delete []如何知道它是一个数组?(C++)
delete []"如何"知道操作数数组的大小?

假设我们有以下课程

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

private:
    int *i;
};
Run Code Online (Sandbox Code Playgroud)

现在我们创建100个Data类型元素的数组

Data* dataArray = new Data[100];
Run Code Online (Sandbox Code Playgroud)

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

bdo*_*lan 6

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

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