当有2个指针指向相同的内存位置时,C ++删除指针

时间:2013-10-22 16:05:10

标签: c++ pointers

让我们说,我有一个指针

  

int * l1 = new int [100 * 100];

     

int * l2 = l1;

现在,l1& l2都指向相同的整数序列。 我将一些值存储在其中。

让我们说,我做了

  

删除[] l1;

l2也被删除了吗?

如果我使用

打印l2的元素
  

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

   cout<<l2[i]; 
     

}

这些值是否可以打印好?

4 个答案:

答案 0 :(得分:18)

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

要迂腐,i1和i2都不会被删除,但他们指出的记忆是。它们仍保留相同的值,但现在可以将其中的内存重用于其他内容。使用已传递给delete的指针是不安全的,因为内存可能已经存在其他内容。

答案 1 :(得分:4)

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

指针就像公寓楼的地址。

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

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

当您'删除'阵列时,您将公寓楼标记为已被谴责且可供重新开发。

许多人在删除之后可能继续拥有现在被谴责的建筑物的地址。

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

答案 2 :(得分:2)

int *l1 = new int[100*100];

有了这个声明, 创建100 * 100的整数数组,即(10,000 * 4字节)。在C int中是4个字节。 enter image description here

使用声明,

int *l2 = l1;

enter image description here

delete [] l1;

enter image description here

答案 3 :(得分:0)

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