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