2

假设我分配了一个整数数组

int test[] = new int[100];

我把指针指向中间的某个地方

int *temp = &test[50];

然后我在 temp 上调用 delete[]

delete[] temp

在这种情况下,编译器如何知道要删除的元素的大小?

4

4 回答 4

8

它不会(或者会,我不知道)。您正在调用未定义的行为。您只能调用delete[]分配给new[].

例如,我在 MSVS 中遇到了崩溃。

于 2012-06-08T07:13:30.630 回答
3

必须传递由 返回的相同内存位置new[],传递其他任何内容都是未定义的行为。

于 2012-06-08T07:14:16.010 回答
1

你不能这样做。编译器必须跟踪它分配的内存大小。该标准没有说明它必须如何做到这一点。一些编译器在返回地址之前存储分配内存的大小。在这种情况下,您正在做的事情可能会导致未定义的行为。

于 2012-06-08T07:15:27.323 回答
1

答案是不。因为delete操作需要定位内存块的位置和它的大小,这主要是在分配数组的第一个成员之前。你应该看看“Inside c++ object model”

于 2012-06-08T07:17:04.687 回答