我可以删除以前动态分配但使用不同指针的内存吗?

Posted

技术标签:

【中文标题】我可以删除以前动态分配但使用不同指针的内存吗?【英文标题】:Can I delete a memory previously allocated dynamically, but with a different pointer? 【发布时间】:2018-05-26 02:04:11 【问题描述】:

我正在用 C++ 编写一个链表程序。为了实现这个概念,我在全局范围内创建了一个指针“start”,指向列表的第一个元素。

程序完成后,我尝试删除所有动态分配的内存以防止内存泄漏,方法是使用 start 和另一个本地声明的指针“p”访问连续节点。 在这里,我使用了一个指向相同正确地址的指针,但这个指针不是用于内存分配的指针,而是像任何普通指针一样在本地声明。

我的问题是 - 是否可以通过使用指向同一位置的普通指针来删除动态分配的内存?

【问题讨论】:

delete pointer that is assigned from another pointer, should i delete the other one again?的可能重复 不要将指针视为指向地址,将其视为地址(并且它指向该地址处的对象)。如果你要拆除主街 35 号的房子,不管地址是如何传达给你的,它仍然是同一所房子。 @molbdnilo:你能把 37 也打碎吗?然后从 36 号可以看到日出。 【参考方案1】:

是的,你可以。这是有效的:

int* p = new int;
int* q = p;
delete q;

使用new[]时的等价物:

int* p = new int[123];
int* q = p;
delete[] q;

用您的指针类型替换int*。之后是否将指针设置为nullptr 还有待商榷。

【讨论】:

请注意 const int* q = p;删除q;也可以,虽然我很想看到一个标准的参考。 @Bathsheba 确实如此。乍一看这似乎违反直觉,但我猜 constimmutable 不是 不能删除 @Bathsheba C++14 [expr.delete]/2 最后说明【参考方案2】:

只要指针的类型和值1与您从new返回的指针相同,是的,您可以将其用作delete论据。

另外,如果您使用new[],请记住使用delete[]


1限定符constvolatile)无关紧要。请注意,您还可以使用指向具有虚拟析构函数的基类的指针。

【讨论】:

"same type" : 具有虚拟析构函数的基类也包含在相同类型中 @UKMonkey,捏住了那个,维基要保持问心无愧。

以上是关于我可以删除以前动态分配但使用不同指针的内存吗?的主要内容,如果未能解决你的问题,请参考以下文章

删除动态分配的内存

在 C++ 中的 2D 动态内存分配数组中释放分配的内存

为啥在 C 中为数组声明和指向数组声明的指针动态分配的内存不同? [复制]

在删除指向动态分配对象的指针向量中的元素之前,我需要做啥?

尝试使用动态内存分配创建节点指针数组

Windows C - 使用 MIDL 协议通过引用动态分配的 unsigned char 内存传递指针