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都不会被删除,但它们指向的记忆是。它们仍然保留着相同的值,但是那里的内存现在可以重新用于其他事情。使用已经传递给
这是一个可以帮助你理解的类比。
指针就像公寓楼的地址。
许多人可能有同一幢楼的地址。
如果其中一个改变了阵列(考虑整修大楼),每个人都会看到它,因为他们都在看同一件事。
当您"删除"阵列时,您会将公寓楼标记为已报废并可重新开发。
许多人可能会继续拥有现在被谴责的建筑地址后,它被删除。
如果他们在删除阵列后引用该阵列(该建筑已报废),则该阵列可能仍然存在,也可能不存在。这取决于这座城市是否有机会拆除这座废弃的建筑物。这样做不安全,但没有什么能阻止你这么做。有时候你走运了,房子还在那里。有时你会发现在那个地方建造了一些新的东西。有时大楼会倒塌在你身上。
1 | int *l1 = new int[100*100]; |
有了这个声明,创建100*100的整数数组,即(10000*4字节)。在C中,int是4字节。
附有声明,
1 | int *l2 = l1; |
1 | delete [] l1; |
未删除I2。I2现在是一个指针,指向一个你不知道存储了什么的地方。这是因为delete[]i1删除变量i1引用的不是指针本身。