嵌套的动态内存怎么释放

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;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^