我已经编写了一个前向链表,但是当我通过valgrind运行它时,它在我的remove(const int函数)中报告了内存泄漏,我无法弄清楚原因。
这是valgrind抱怨的删除功能。 该函数位于文件“list.cc”中。
void Plist::remove(const int pos)
{
current_index = root;
if( pos == 0 )
{
delete root;
root = current_index -> pointer;
}
else
{
for(int n = 0; n<pos-1; ++n)
{
current_index = current_index -> pointer;
}
index * new_link = current_index -> pointer -> pointer;
delete current_index -> pointer;
current_index -> pointer = new_link;
}
}
这是属于“list.cc”的头文件“list.h”。
class Plist
{
private:
class index
{
public:
index(int value, index * ptr);
index(int value);
int val{0};
index * pointer{nullptr};
};
index * root = nullptr;
index * current_index = nullptr;
public:
Plist(){}
~Plist();
Plist (Plist& lst);
Plist& operator=(Plist& lst);
void insert(const int val);
void remove(const int pos);
void print();
};
任何帮助表示赞赏!
答案 0 :(得分:2)
这不是您的错误,但此代码不能正确:
current_index = root;
if( pos == 0 )
{
delete root;
root = current_index -> pointer;
}
自current_index = root
起,delete root
表示current_index
现在指向已销毁的对象,您将在下一行中取消引用该对象。糟糕。
答案 1 :(得分:1)
不是您询问的问题,但此代码不起作用:
current_index = root;
if( pos == 0 )
{
delete root;
root = current_index -> pointer;
}
delete root
后root
指向的对象或root
的副本(例如current_index
)已经死亡。你需要这样的东西:
current_index = root;
if (pos == 0) {
current_index = current_index->pointer;
delete root;
root = current_index;
}