2012-06-08 42 views
2

删除阵列可以说,我分配整数从偏移

int test[] = new int[100]; 

我一个指针指向中间的某个位置

int *temp = &test[50]; 

然后我请删除[]中的临时的阵列

delete[] temp 

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

+0

你能解释一下在你想这样做的情况下? –

+0

如果您试图缩小阵列,则不能这样做。如果您需要调整大小,请使用'std :: vector'。 – molbdnilo

+0

我在想,如果我有一个大阵,并迅速释放一些空间需要 - 这将有可能只是免费不必要的东西,而不是使副本,并释放原... – Makubex

回答

8

它不会(或不会,我不知道)。您正在调用未定义的行为。只允许您使用拨号为new[]的指针拨打delete[]

例如,我遇到了MSVS崩溃。

3

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

1

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

1

答案是否定的。 因为删除操作符需要定位内存块的位置和它的大小,它大多在分配数组的第一个成员之前。 你应该看看“内部C++对象模型”

+1

“如何将编译器知道元素的大小在这种情况下删除?“ - “答案是否定的”:) –

+0

感谢Inside C++提及:) – Makubex