自定义链表C++中的内存泄漏
Memory Leak in Custom Linked List C++
对于作业,我不能使用 STL 列表,它必须是自定义列表。正如标题所述,即使我在节点\项目上调用删除,我也有内存泄漏。我将不胜感激对此的任何帮助。
列出源
template <typename T>
class DLinkList
{
private:
struct Node
{
T data;
Node *nextNode;
Node *prevNode;
Node(T data, Node *nextNode = nullptr, Node *prevNode = nullptr)
{
this->data = data;
this->nextNode = nextNode;
this->prevNode = prevNode;
}
~Node() { delete data; }
};
Node *head;
Node *tail;
public:
DLinkList();
~DLinkList();
void push_back(T data);
};
template <typename T>
inline void DLinkList<T>::push_back(T data)
{
if (isEmpty())
{
head = new Node(data);
tail = head;
}
else
{
tail->nextNode = new Node(data, nullptr, tail);
tail = tail->nextNode;
}
}
template <typename T>
DLinkList<T>::DLinkList()
{
head = nullptr;
tail = nullptr;
}
template <typename T>
DLinkList<T>::~DLinkList()
{
Node *ptr = head;
while (ptr->nextNode != nullptr)
{
Node *garbage = ptr;
ptr = ptr->nextNode;
delete garbage;
}
}
Foo 类和主要
class Foo
{
public:
Foo() { i = 0; d = 0.0; }
Foo(int i, double d) { this->i = i; this->d = d; }
int getInteger() { return i; }
double getDouble() { return d; }
private:
int i;
double d;
};
int main()
{
DLinkList<Foo*> f1;
f1.push_back(new Foo());
f1.push_back(new Foo(2, 5.5));
cout << "1st Values: " << f1.at(0)->getInteger() << ", " << f1.at(0)->getDouble() << endl;
cout << "2nd Values: " << f1.at(1)->getInteger() << ", " << f1.at(1)->getDouble() << endl;
return 0;
}
从 瓦尔格林德
==12125== 40 (24 direct, 16 indirect) bytes in 1 blocks are definitely lost in loss record 3 of 3
==12125== at 0x4C29203: operator new(unsigned long) (vg_replace_malloc.c:334)
==12125== by 0x400FD8: DLinkList<Foo*>::push_back(Foo*) (DLinkList.hpp:138)
==12125== by 0x400CF3: main (Source.cpp:28)
我不确定这里的记忆是如何丢失的,我想说这是因为它正在复制它,而原件正在丢失。如果是这种情况,我不熟悉如何处理它。
同样,我感谢任何帮助理解这一点。我试图浏览所有相关问题,但我没有看到任何涵盖这一点的内容,或者至少我不理解它。谢谢!
鉴于注释中指出的其他问题,例如错误地显式调用DLinkList
析构函数,您正在main()
执行此操作:
f1.push_back(new Foo());
f1.push_back(new Foo(2, 5.5));
您正在对无法恢复的这两行代码创建即时内存泄漏。 您正在呼叫new
但没有保存从new
返回的地址,以便以后可以呼叫该地址delete
。
因此,main
必须管理这些动态分配的Foo
对象。 像这样:
Foo* p1 = new Foo();
Foo *p2 = new Foo(2, 5.5);
f1.push_back(p1);
f1.push_back(p2);
//...
delete p1;
delete p2;
这应该可以解决内存泄漏问题,但这在当今C++时代是糟糕的编程实践。 您很可能会使用
DLinkList<Foo>
并将Foo
对象放在链表中,因此不需要在main
中进行任何手动内存管理,或者使用智能指针并具有智能指针的链表,即
DLinkList<std::unique_ptr<Foo>>
好吧,所以我只是筋疲力尽,错过了最简单的东西。在与我创建的其他列表进行比较后,我意识到我的析构函数没有正确删除节点。
template <typename T>
DLinkList<T>::~DLinkList()
{
Node *ptr = head;
while (ptr != nullptr) // Not: ptr->nextNode
{
Node *garbage = ptr;
ptr = ptr->nextNode;
delete garbage;
}
}
但我确实要感谢PaulMcKenzie,这是一个很大的帮助,并指出主要确实需要处理新电话的删除。我会投票给他并标记它。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏