Memory management 在C++;(删除运算符) 我与C++中的删除[]操作符混淆了。我知道它的目的是释放动态内存(堆)。但我尝试了下面的代码,发现了一些问题: int *dynArrOne = new int[10]; int *dynArrTwo = nullptr;

Memory management 在C++;(删除运算符) 我与C++中的删除[]操作符混淆了。我知道它的目的是释放动态内存(堆)。但我尝试了下面的代码,发现了一些问题: int *dynArrOne = new int[10]; int *dynArrTwo = nullptr;,memory-management,memory-leaks,free,dynamic-arrays,delete-operator,Memory Management,Memory Leaks,Free,Dynamic Arrays,Delete Operator,因此,它正在堆栈中的指针dynArrOne在堆中创建10个新地址。然后我写道: int *dynArrOne = new int[10]; int *dynArrTwo = dynArrOne; 因此,dynArrTwo和dynArrOne现在指向堆中的相同地址。如果我写:delete[]dynArrOne,堆中的内存将被释放。问题是我无法通过dynArrTwo释放堆中的内存:delete[]dynArrTwo。我是说,为什么会这样?为什么我不能通过dynArrTwo释放堆中的内存 当你复制一

因此,它正在堆栈中的指针dynArrOne在堆中创建10个新地址。然后我写道:

int *dynArrOne = new int[10];
int *dynArrTwo = dynArrOne;
因此,dynArrTwodynArrOne现在指向堆中的相同地址。如果我写:
delete[]dynArrOne,堆中的内存将被释放。问题是我无法通过dynArrTwo释放堆中的内存:
delete[]dynArrTwo
。我是说,为什么会这样?为什么我不能通过dynArrTwo释放堆中的内存

当你复制一个指针时,这就是你所做的一切——你没有复制指向的内存

因此,您的语句
int*dynArrTwo=dynArrOne
只是复制存储在RHS指针中的地址。当任一变量指向的内存通过
delete[]
操作释放时,两个指针都将失效

这样想:我可以在两张纸上写下一所房子的地址(同样的地址,同样的房子),然后分别给两个不同的拆迁人一张纸。如果第一个拆房子的人去把房子推倒,那么第二个拆房子的人以后就不能再这样做了,是吗?

当你复制一个指针时,你所做的就是这样,你没有复制指向的内存

因此,您的语句
int*dynArrTwo=dynArrOne
只是复制存储在RHS指针中的地址。当任一变量指向的内存通过
delete[]
操作释放时,两个指针都将失效


这样想:我可以在两张纸上写下一所房子的地址(同样的地址,同样的房子),然后分别给两个不同的拆迁人一张纸。如果第一个拆房的人去拆了房子,那么第二个拆房的人就不能再去拆房子了,他可以吗?

好的,告诉我我是否错了:“让我们定义
dynArrOne[2]=5;
例如,让dynArrTwo也指向dynArrOne指向的同一地址。因此
dynArrTwo[2]的输出
5.为了证明dynArrOne和dynArrTwo指向相同的地址,需要修改dynArrTwo中的值。比如说,
dynArrTwo[2]=7
,结果是
dynArrOne[2]
也是7。因此,它们指向相同的地址是正确的。当我说
delete[]DynarTwo
,仍然可以说
DynarTwo[2]
dynArrOne[2]
,没有任何变化。我尝试过这个,所以我错过了一些概念吗?@raihansyaharahap OK!这里所说的是未定义的行为——即使您的程序通过
delete[]
调用“正式”释放了内存,但该内存(在您的情况下)仍然存在。由于它还没有(尚未)被任何其他代码修改,您看到的是“旧”值-但您永远不能相信会发生这种情况。好的,如果我错了,请告诉我:“例如,让我们定义
dynArrOne[2]=5;
。并使dynArrTwo也指向dynArrOne指向的相同地址。因此,
dynArrTwo[2]的输出
5.为了证明dynArrOne和dynArrTwo指向相同的地址,需要修改dynArrTwo中的值。比如说,
dynArrTwo[2]=7
,结果是
dynArrOne[2]
也是7。因此,它们指向相同的地址是正确的。当我说
delete[]DynarTwo
,仍然可以说
DynarTwo[2]
dynArrOne[2]
,没有任何变化。我尝试过这个,所以我错过了一些概念吗?@raihansyaharahap OK!这里所说的是未定义的行为——即使您的程序通过
delete[]
调用“正式”释放了内存,但该内存(在您的情况下)仍然存在。因为它还没有被任何其他代码修改过,所以您看到的是“旧”值——但您永远不能指望会发生这种情况。