让我们说,我有一个指针
int * l1 = new int [100 * 100];
int * l2 = l1;
现在,l1& l2都指向相同的整数序列。 我将一些值存储在其中。
让我们说,我做了
删除[] l1;
l2也被删除了吗?
如果我使用
打印l2的元素for(int i = 1; i< = 10000; i ++){
cout<<l2[i];
}
这些值是否可以打印好?
答案 0 :(得分:18)
i2仍指向同一个地方,但该内存现已被释放。试图通过它访问任何东西是未定义的行为,这意味着您的价值可能会被打印,或者您的房子可能会着火。这不取决于你。
要迂腐,i1和i2都不会被删除,但他们指出的记忆是。它们仍保留相同的值,但现在可以将其中的内存重用于其他内容。使用已传递给delete
的指针是不安全的,因为内存可能已经存在其他内容。
答案 1 :(得分:4)
这是一个可以帮助你理解的类比。
指针就像公寓楼的地址。
许多人可能拥有同一建筑物的地址。
如果他们中的一个改变了阵列(考虑翻新建筑物),每个人都会看到它,因为他们都在看同样的事情。
当您'删除'阵列时,您将公寓楼标记为已被谴责且可供重新开发。
许多人在删除之后可能继续拥有现在被谴责的建筑物的地址。
如果他们在删除数据后引用该数组(该建筑物被谴责),它可能会或可能不存在。这取决于城市是否绕过摧毁被谴责的建筑物。这样做并不安全,但没有什么能阻止你这样做。有时候你很幸运,建筑仍在那里。有时你会发现在那个地方建造了一些新东西。有时建筑物会落在你身上。
答案 2 :(得分:2)
int *l1 = new int[100*100];
有了这个声明, 创建100 * 100的整数数组,即(10,000 * 4字节)。在C int中是4个字节。
使用声明,
int *l2 = l1;
delete [] l1;
答案 3 :(得分:0)
I2 未已删除。 I2现在是指向一个你不知道存储内容的地方的指针。这是因为delete [] I1删除变量 I1引用而不是指针本身。