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

C++ deleting a pointer when there are 2 pointers pointing to the same memory locations

比如说,我有一个指针

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

int *l2 = l1;

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

让我说,我做

delete [] l1;

L2是否也被删除?

如果我使用

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

1
   cout<<l2[i];

}

这些值可以打印吗?


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

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


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

指针就像公寓楼的地址。

许多人可能有同一幢楼的地址。

如果其中一个改变了阵列(考虑整修大楼),每个人都会看到它,因为他们都在看同一件事。

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

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

如果他们在删除阵列后引用该阵列(该建筑已报废),则该阵列可能仍然存在,也可能不存在。这取决于这座城市是否有机会拆除这座废弃的建筑物。这样做不安全,但没有什么能阻止你这么做。有时候你走运了,房子还在那里。有时你会发现在那个地方建造了一些新的东西。有时大楼会倒塌在你身上。


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

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

附有声明,

1
int *l2 = l1;

enter image description here

1
delete [] l1;

enter image description here


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