2

我知道不应该将 new[] 与 delete 混合和匹配,反之亦然(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 个位置的块,尽管我可以 new/delete 管理其中的整数。

4

2 回答 2

6

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

Even if you could, it would result in undefined behavior (saying you have an array of pointers which you allocate with new[] and attempt to delete it with delete). Mixing new[] with delete and new[] with delete results in UB.

于 2012-12-03T21:38:31.080 回答
3

无论哪种方式,您都不能混搭。如果你这样做,你有未定义的行为(§5.3.5/2):

在第一种选择delete object)中,操作数的值delete可以是空指针值、指向由先前的new-expression创建的非数组对象的指针或指向表示基的子对象(1.8)的指针此类对象的类别(第 10 条)。如果不是,则行为未定义。

在第二种选择删除数组)中,操作数的值delete可以是空指针值或由前一个数组new-expression产生的指针值。如果不是,则行为未定义。

(粗体强调是我的)

于 2012-12-03T21:38:19.037 回答