如何在不泄漏内存的情况下删除链接列表
How can I delete a linked list without memory leak?
我正在尝试制作电话簿,然后将数据存储在链接列表中。但是,当我尝试删除它时,我要么获得内存泄漏或一些丑陋的退出状态,并从内存中获得一些值。我猜该退出状态在删除我的列表时标志着一些问题,因为该程序不会继续进行下一行。
我已经尝试过来来回乱七八糟,但是看来我无法自己解决。
我有三个重要的课程。一本用于电话簿,一个用于联系人,另一个用于联系人的数据成员。数据类是抽象的,并且有一些派生类。另外,我还有一个链接列表结构,用于将其存储在电话簿中,并将数据存储在联系人中。
链接列表结构:
#include "Data.h"
class Contact; //to avoid an "undefined reference" error
struct ListMem{
ListMem* next=NULL;
Contact* cont=NULL;
Data* dat=NULL;
}; //this class can't have a destructor that calls "delete cont",
//because of the order I declared my classes in
电话簿课:
#include "Contact.h"
#include "ListMem.h"
class Phonebook{
size_t cont_num; //how many contacts are already stored
ListMem* cont; //pointer to the first member of the linked list
public:
Phonebook(const char* filename){ //reads the Phonebook from file
std::ifstream is;
is.open(filename);
size_t pb_size;
string line;
ListMem* tmp;
is>>pb_size; getline(is, line);
cont_num=0;
for(size_t i=0; i<pb_size; i++){
getline(is, line);
if(i==0){
Contact* tmp_ct=new Contact(line);
cont=add_cont(tmp_ct);
tmp=cont;
}
else {
Contact* tmp_ct=new Contact(line);
tmp->next=add_cont(tmp_ct);
tmp=tmp->next;
}
}
}
ListMem* add_cont(Contact* new_ct){ //adds a new contact
ListMem* tmp=new ListMem;
tmp->cont=new Contact(new_ct);
cont_num++;
return tmp;
}
~Phonebook(){
ListMem* tmp=cont;
while(tmp!=NULL){
ListMem* del=tmp;
tmp=tmp->next;
delete del->dat;
delete del->cont;
delete del;
}
}
};
联系人类:
#include "Name.h"
#include "ListMem.h"
class Contact{
size_t data_num; //number of data stored
ListMem* data; //pointer to the first data member
public:
Contact(string line){ //converts a "line" into a Contact
ListMem* tmp;
int dat_count=std::count(line.begin(), line.end(), ':');
data_num=dat_count;
string dat, tmp_dat, tmp_type;
int pos_1=0, pos_2=line.find(';');
for(int i=0;i<dat_count;i++){
dat=line.substr(pos_1, pos_2-pos_1);
tmp_type=dat.at(0);
tmp_dat=dat.substr(2, dat.size()-2);
pos_1+=dat.size()+1;
pos_2=line.find(';', pos_1);
if(i==0){
data=add_data(tmp_type, tmp_dat);
tmp=data;
}
else {
tmp->next=add_data(tmp_type, tmp_dat);
tmp=tmp->next;
}
}
}
ListMem* add_data(string type, string data){ //adds a new data member
ListMem* tmp=new ListMem;
if(type=="1") tmp->dat=new Name(data);
//I have more, but it's irrelevant.
data_num++;
return tmp;
}
~Contact(){
ListMem* tmp=data;
while(tmp!=NULL){
ListMem* del=tmp;
tmp=tmp->next;
delete del->dat;
delete del->cont;
delete del;
}
}
};
数据类:
class Data{
string type;
public:
Data(){}
void set_type(string t) {type=t;}
virtual ~Data(){}
};
派生类之一,其他类别看起来基本相同:
#include "Data.h"
class Name: public Data{
string name;
public:
Name(string n): name(n){ set_type("1");}
~Name(){}
};
,当然是主要:
#include "Phonebook.h"
int main(){
Phonebook* Test=new Phonebook("test.txt");
delete Test;
return 0;
}
在" test.txt"文件中,我有我的测试电话:
3
1:test_name_1;
1:test_name_2;
1:test_name_3;
因此,当我运行此代码时,我会有内存泄漏,我不知道为什么。我使destructor沿着链接列表运行并划分动态内存,或者至少这就是我的想法。
我知道我不会按照应有的方式处理联系人,因为我使用了内存泄漏的检查器工具,并且图案重复了与我的联系人相同的时间。
我使用了.cpp文件,但是我在这里集成了相关部分以节省一些空间。另外,我没有放在这里包括我的项目系统。
我强烈怀疑问题是destructors,〜phonebook((,〜ctenter((或两者兼而有之。我把其他部件放在这里,因为我被告知要发布任何人可以在没有太多麻烦的情况下复制的版本。我觉得一定有一个愚蠢的错误和一个简单的解决方案,但我不知道什么。
你们能帮我一点吗?
电话簿构造函数解析文件,使用新操作员创建联系对象,然后将其传递给add_cont((。成员函数add_cont((创建了一个使用新操作员再次传递给参数的联系对象的副本,但切勿删除Origin。从我的角度来看,add_cont(('new_ct'的角度可以分配给'tmp-> cont'。
顺便说一句,更好的方法是使用可用的容器类,例如std :: list,std :: vector等,避免使用原始指针。
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- 类(可能是代理)的命名,允许在不修改基础容器的情况下对项目进行排序和删除
- 在不使用任何 STL 容器的情况下删除重复项
- 如何在不泄漏内存的情况下删除链接列表
- 使用QT,如何在不读取整个文件的情况下删除文本文件中的第一行
- C++ 如何在不丢失内存的情况下删除节点
- 如何在没有递归的情况下删除链接列表
- 在只给定单个链接列表中间的节点的情况下删除该节点.C++
- 在不使用虚拟析构函数的情况下删除继承的对象时中止
- 检查目录树是否可以在不实际开始删除的情况下删除
- 如何在不知道其类型的情况下删除结构
- C++ 在不知道位置的情况下删除矢量中的特定值
- 如何在不导入任何库的情况下删除矢量
- 重写类运算符new并在不更改类的情况下删除
- 如何在无权访问的情况下删除对象
- 我将如何在不损坏列表的情况下删除链表中的节点
- Qmake:如何在不更改Qmake .conf的情况下删除某个项目的编译器标志
- 我可以在不检查是否存储该对象的情况下删除联合组件吗?
- 内存管理 - 是否可以在不调用析构函数的情况下删除 c++ 中的对象
- 我可以在不中断代码的情况下删除此警告吗?