假设我分配了一个整数数组
int test[] = new int[100];
我把指针指向中间的某个地方
int *temp = &test[50];
然后我在temp
上调用delete []delete[] temp
在这种情况下,编译器如何知道要删除的元素的大小?
答案 0 :(得分:8)
它不会(或将会,我不知道)。您正在调用未定义的行为。您只能在分配了delete[]
的指针上调用new[]
。
例如,我在MSVS中崩溃了。
答案 1 :(得分:3)
你必须传递new[]
返回的相同内存位置,传递任何其他内容是未定义的行为。
答案 2 :(得分:1)
你做不到。编译器必须跟踪它分配的内存大小。标准没有说明它必须如何。有些编译器会在返回的地址之前存储已分配内存的大小。在这种情况下,您正在做的事情可能会导致未定义的行为。
答案 3 :(得分:1)
答案是否定的。 因为删除操作符需要定位内存块的位置及其大小,这大部分位于分配的数组的第一个成员之前。 你应该看一下“Inside c ++对象模型”