C++ C++;这个析构函数会泄漏资源吗?

C++ C++;这个析构函数会泄漏资源吗?,c++,memory-management,memory-leaks,linked-list,C++,Memory Management,Memory Leaks,Linked List,我想知道如何确保在单链接列表上调用delete时不会泄漏内存(顺便说一句,手动实现) 我创建了这些超级基本的列表、节点和个人类,让自己更清楚一点 给你: class person { public: person(); //something to do like sets gets etc... virtual ~person(); private: int id; person* pplArr[5]; //Dynamically allocated p

我想知道如何确保在单链接列表上调用
delete
时不会泄漏内存(顺便说一句,手动实现)

我创建了这些超级基本的
列表
节点
个人
类,让自己更清楚一点

给你:

class person {
public:
    person();
    //something to do like sets gets etc...
    virtual ~person();
private:
    int id;
    person* pplArr[5]; //Dynamically allocated person objs.
};
person::person(){
    pplArr[5] = NULL;
}
person::~person(){
    for(int i = 0; i < 5; i++)
        delete pplArr[i];
}


好的,正如你所看到的,我们有三个类:

person
包含一个由5个人对象组成的数组,动态分配:

节点
包含指向
下一个
节点的指针,以及
数据
,其中包含实际的
人员
对象。以及

包含并管理节点的
列表

为了成功地释放所有内存,我需要调用
delete listName
,此行将进入每个节点,并为每个
节点调用
delete
,这本身将为
人调用
delete

person的
delete
将进入每个阵列插槽,并调用这些person的“delete”来释放内存

之后,它将执行正在等待的其他删除。从下到上

这是正确的吗?我的析构函数正确吗

我只想知道,如果存在一个包含具有动态分配内存的对象的节点的单链表,如何完全释放我分配的内存

我很困惑,如果这是胡说八道或是完全糟糕的实现,我深表歉意


PS:我不知道这个列表是否有效,我只是想制作一个基本的链表,看看你们是否能帮助我理解,所以希望我能在实际的、更复杂的列表上掌握这个概念。我知道图书馆里有链接列表和其他数据结构,但大学老师要求我们先这样做

请不要自己使用
new
delete
。只需使用。OT:
pplArr[5]=NULL正在脱离数组的限制。谢谢!我明白,这里的问题是,我的老师要求我们这样做,在使用auto stuff之前先学习语言和内部工作通过设置
pplArr[5]=NULL
,这个问题更适合于构造函数显示未定义的行为,因为具有5个元素的数组的有效索引是
0
4
。析构函数还显示未定义的行为,因为构造函数不会通过
pplArr[4]
初始化
pplArr[0]
,您显示的其他代码也不会初始化,并且析构函数会对每个代码使用操作符
delete
。所以,虽然可能没有内存泄漏,但也不能保证程序的正确行为。
#include "person.h"
class node {
public:
    node(person*, node*);
    person* getData();
    node*   getNext();
    void    setNext(node*);

    virtual ~node();
private:

    person* data;
    node*   next;
};

node::node(person* p, node* n){
    data = p;
    next = n;
}
person* node::getData(){
    return data;
}

node* node::getNext(){
    return next;
}

void node::setNext(node* nxt){
    next = nxt;
}

node::~node(){
    //nothing to delete "manually".
}
#include "node.h"

class list {
public:
    list();

    node* getFirst();
    void  insert(person*);

    virtual ~list();
private:

    node* first;
};

node* list::getFirst(){
    return first;
}
void list::insert(person* p){
    if(first){
        first->setNext(new node(p, NULL));
    }
    else {
        first = new node(p, NULL);
    }
}
list::~list(){
    node* aux;
    while (first){
        aux = first->getNext();
        delete first;
        first = aux;
    }
}