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