struct A{
int a;
A*q;
};
A*p=new A;
p->q=new A;
delete p->q;
delete p;
可能这种是正确的,但是我觉得为什么仅delete p;这一个操作不行,q这个指针也是分配在p指向的内存地址里?为什么delete p不会触发它其中q指向的内存地址一同被释放掉?
delete p; 仅仅会释放掉 p 指向的内存地址,q 指向的内存地址不会被释放,因为 delete p 并不知道 q 这个指针的存在,也就无法释放掉 q 指向的内存地址。
如果有多层嵌套的动态内存,那么就需要从最里层开始释放,比如用深度优先算法,先释放最深层的动态内存,然后释放它的上一层,依次类推,最后释放最外层的动态内存。
在释放嵌套的动态内存时,需要先释放内层动态内存,再释放外层动态内存。
对于你提供的代码,首先使用 new A 分配了一个 A 类型的内存并将其地址赋值给 p 指针,然后在这个内存中又使用 new A 分配了另一个 A 类型的内存并将其地址赋值给 p->q 指针。此时,可以将这两块内存视为相互独立的,p 和 p->q 只是保存了这两块内存的地址,它们之间没有任何关系。
因为存在一种情况
就是内部指针指向的内存,你现在并不想释放
或者它本身指向的就不是new出来的
而是本来存在的一个数组
随便释放是不行的
你使用 delete p 释放 p 指向的内存时,它所包含的成员变量 q 的内存不会被自动释放。你有在 delete p 之前,先释放 p->q 指向的内存,这是没问题的。那么关于释放嵌套的动态内存,大致的思路就是释放内部动态分配的内存,再释放外部动态分配的内存。
打个比方:
#include <iostream>
using namespace std;
struct A {
int a;
A* q;
};
int main() {
// 分配内存
A* p = new A;
p->q = new A;
// 使用内存
p->a = 1;
p->q->a = 2;
cout << p->a << " " << p->q->a << endl;
// 释放内存
delete p->q; // 释放内部内存
delete p; // 释放外部内存
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话: