1

可以说,我有一个指针

int *l1 = 新的 int[100*100];

诠释 *l2 = l1;

现在, l1 和 l2 都指向同一个整数序列。我在其中存储了一些值。

可以说,我愿意

删除 [] l1;

l2也被删除了吗?

如果我使用打印 l2 的元素

for(int i=1;i<=10000;i++){

   cout<<l2[i]; 

}

这些值会被打印出来吗?

4

4 回答 4

20

i2 仍然指向同一个地方,但该内存现在已被释放。试图通过它访问任何东西都是未定义的行为,这意味着您的价值观可能会被打印出来,或者您的房子可能会着火。这不取决于你。

为了迂腐,i1 和 i2 都没有被删除,但他们指向的内存是。它们仍然保留相同的值,但那里的内存现在可以用于其他事情。使用已传递给的指针是不安全的,delete因为内存可能已经有其他东西了。

于 2013-10-22T16:06:40.727 回答
5

这是一个可以帮助你理解的类比。

指针就像公寓楼的地址。

许多人可能拥有同一建筑物的地址。

如果其中一个人改变了阵列(想想翻新建筑物),每个人都会看到它,因为他们都在看同一件事。

当您“删除”阵列时,您会将公寓楼标记为已废弃并可重新开发。

很多人在删除后可能会继续拥有现在被废弃的建筑物的地址。

如果他们在删除后引用数组(建筑物被谴责),它可能仍然存在,也可能不存在。这取决于该市是否有时间拆除这座被谴责的建筑。这样做并不安全,但没有什么能阻止你这样做。有时你很幸运,建筑物仍然在那里。有时你会发现在那个地方建造了一些新东西。有时建筑物会倒在你身上。

于 2013-10-22T16:21:42.617 回答
2
int *l1 = new int[100*100];

使用此语句,创建了 100*100 的整数数组,即(10,000 *4 字节)。在 C 中 int 是 4 个字节。 在此处输入图像描述

与声明,

int *l2 = l1;

在此处输入图像描述

delete [] l1;

在此处输入图像描述

于 2013-10-22T16:47:57.440 回答
0

I2不会被删除。I2 现在是一个指针,指向一个你不知道存储什么的地方。这是因为 delete[] I1 删除的是I1 引用的变量而不是指针本身。

于 2013-10-22T16:12:23.467 回答