如果我在C++中分配一个带有运算符 new[] 的对象数组,但单独释放它们是否仍然构成内存泄漏

If I allocate an a array of objects with operator new[] in C++ but deallocate them individually does it still constitute a memory leak?

本文关键字:单独 释放 对象 数组 是否 内存 泄漏 分配 C++ new 运算符      更新时间:2023-10-16

我知道不应该将new[]与删除混合和匹配,反之亦然(delete[]与new)。所以

int* k = new int[5];
delete k;

有缺陷,因为它不会释放分配的数组。但以下有错吗?

int *k = new int[5];
for (int i = 0; i < 5; ++i)
    delete k[i];

我的意思是错误的 - 它真的会导致内存泄漏或未定义的行为吗?

编辑**我的错,我的意思是这样的:

int** k = new int*[5];
memset(k, 0, sizeof(int*)*5);
k[3] = new int;
for (int i = 0; i < 5; ++i)
    if (k[i])
    {
        delete k[i];
        k[i] = 0;
    }

在上面,除非我在k本身上调用 delete[],否则 5 个位置的块实际上永远不会被释放,尽管我可以新建/删除管理其中的整数。

k[i]是一个int,所以在语法上调用delete是无效的。编译器应引发错误。

即使可以,也会导致未定义的行为(假设您有一个指针数组,您可以使用new[]分配并尝试使用delete删除它)。将new[]delete混合,将new[]delete混合会产生 UB。

无论哪种方式都不能混合搭配。如果这样做,则存在未定义的行为(§5.3.5/2):

在第一种替代方法删除对象)中,delete 的操作数的值可以是空指针值、指向由上一个新表达式创建的非数组对象的指针,或者指向表示此类对象的基类的子对象 (1.8) 的指针(条款 10)。否则,行为未定义。

在第二种替代方法删除数组)中,delete的操作数的值可以是空指针值,也可以是由前一个数组 new-expression 产生的指针值。否则,行为未定义。

(粗体强调是我的)