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

C++ C++;当有两个指针指向相同的内存位置时删除指针,c++,pointers,C++,Pointers,比方说,我有一个指针 int*l1=新int[100*100] int*l2=l1 现在,l1和l2都指向相同的整数序列。 我将一些值存储到它们中 比如说,我喜欢 删除[]l1 l2是否也被删除 如果我使用 for(int i=1;ii2仍然指向相同的位置,但内存现在已被释放。试图通过它访问任何内容是未定义的行为,这意味着您的值可能会被打印,或者您的房子可能会着火。这不取决于您 迂腐地说,i1和i2都不会被删除,但它们指向的内存会被删除。它们仍然保留相同的值,但那里的内存现在可以用于其他用途。使

比方说,我有一个指针

int*l1=新int[100*100]

int*l2=l1

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

比如说,我喜欢

删除[]l1

l2是否也被删除

如果我使用


for(int i=1;ii2仍然指向相同的位置,但内存现在已被释放。试图通过它访问任何内容是未定义的行为,这意味着您的值可能会被打印,或者您的房子可能会着火。这不取决于您


迂腐地说,i1和i2都不会被删除,但它们指向的内存会被删除。它们仍然保留相同的值,但那里的内存现在可以用于其他用途。使用已传递到
delete
的指针是不安全的,因为内存中可能已经有其他内容。

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


迂腐的说,i1和i2都不会被删除,但它们指向的内存会被删除。它们仍然保留相同的值,但那里的内存现在可以用于其他用途。使用已传递到
delete
的指针是不安全的,因为内存中可能已经有其他内容。

i2不会被删除。i2现在是一个指向不知道存储内容的位置的指针。这是因为delete[]I1删除变量I1而不是指针本身。

I2未被删除。I2现在是指向不知道存储内容的位置的指针。这是因为delete[]I1删除变量I1,而不是指针本身。

这里有一个可以帮助您理解的类比

指针就像公寓楼的地址

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

如果其中一个改变了阵列(想想翻修建筑),每个人都会看到,因为他们都在看同一个东西

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

许多人可能会在这座现在已经废弃的建筑物被删除后继续拥有它的地址


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

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

int *l1 = new int[100*100];
指针就像公寓楼的地址

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

如果其中一个改变了阵列(想想翻修建筑),每个人都会看到,因为他们都在看同一个东西

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

许多人可能会在这座现在已经废弃的建筑物被删除后继续拥有它的地址

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

int *l1 = new int[100*100];
有了这句话,, 创建100*100的整数数组,即(10000*4字节)。在C中,int是4字节。

带着声明

int *l2 = l1;

有了这句话,, 创建100*100的整数数组,即(10000*4字节)。在C中,int是4字节。

带着声明

int *l2 = l1;


当您说
delete x
delete[]x
时,您命名的变量并不重要。重要的是值。例如,说
int*x=new int;
会将
x
设置为0x12341234;现在,如果代码包含
delete(int*)0x12341234;
以后,内存会正确释放。(当然,如果
x
的值不是
0x12341234
那么程序就坏了。)这是指针的一个基本复杂性。我发现使用
std::shared\u ptr
很有帮助,还可以在删除指针后将指针的值设置为
NULL
,这样我就知道了(或者得到了更好的错误)当删除后错误地访问它们时。当您说
delete x
delete[]x
时,您命名的变量并不重要。重要的是值。例如说
int*x=new int;
会将
x
设置为0x12341234;现在如果代码包含
delete(int*)0x12341234;
之后,内存被正确释放。(当然,如果
x
的值不是
0x12341234
则程序被中断。)这是指针的一个基本复杂性。我发现使用
std::shared_ptr
很有帮助,还可以在删除指针后将其值设置为
NULL
,这样我就知道了(或者得到更好的错误)当它们在删除后被错误地访问时。当建筑物不在那里时,你会幸运。当UB是崩溃而不是隐藏的bug时,我会幸运。当建筑物不在那里时,你会幸运。当UB是崩溃而不是隐藏的bug时,我会幸运。这不是“迂腐的”。这是为了使用指针,你必须理解的东西。不是“迂腐的”。为了使用指针,你必须理解这一点。