为什么我在这里出现内存泄漏
Why am I getting a memory leak here?
Main.cpp
#include<iostream>
#include "Queue.h"
using namespace std;
char* PotionTypeString(PotionType type)
{
char* s = "UNKNOWN";
switch (type) {
case SPEED:
s = "Speed";
break;
case STRENGTH:
s = "Strength";
break;
case HEALTH:
s = "Health";
break;
case WISDOM:
s = "Wisdom";
break;
}
return(s);
}
int main()
{
Queue q;
q.enqueue(WISDOM);
q.dequeue();
#ifdef _WIN32
if (_CrtDumpMemoryLeaks()) {
cout << "Memory leaks!" << endl;
} else {
cout << "No leaks" << endl;
}
#endif
return 0;
}
队列.cpp
#include "Queue.h"
#include <string.h>
#include <iostream>
using namespace std;
Queue::Queue() {
front = NULL;
rear = NULL;
size = 0;
}
Queue::~Queue() {
Node* cur = front;
while (cur != NULL) {
Node* temp = cur->next;
delete cur;
cur = temp;
}
}
void Queue::enqueue(PotionType type) {
Node* node = new Node();
node->type = type;
if (front == NULL) {
front = node;
}
else {
rear->next = node;
}
rear = node;
size = size + 1;
}
PotionType Queue::dequeue() {
PotionType toRet;
if (front != NULL) {
Node* node = new Node();
node = front;
front = front->next;
toRet = node->type;
delete(node);
size = size - 1;
}
return toRet;
}
void Queue::print() {
if (front == NULL) {
cout << "Empty list" << endl;
}
else {
Node * toPrint = new Node();
toPrint = front;
while (toPrint != NULL) {
cout << PotionTypeString(toPrint->type) << endl;
toPrint = toPrint->next;
}
}
}
在 main 函数中,我只是实例化一个空队列,添加一个项目,然后取消对单个项目的排队,我得到内存泄漏,我觉得这与我的取消排队方法或我的析构函数有关......
不过,我对C++有点陌生,所以我不完全确定。
有人愿意在这里帮助我吗?
编辑:
我输入了user4581301建议的更改,它解决了我的内存泄漏问题,只需去
Queue q;
q.enqueue(WISDOM);
q.dequeue();
但是,如果我删除 q.dequeue() 并将其留给析构函数,则会收到内存泄漏。
In Queue::dequeue
Node* node = new Node();
分配一个新节点,该节点的地址被及时覆盖并泄露
node = front;
将两行替换为
Node* node = front;
立即将node
指向front
就足够了。
正如迈尔斯·布德内克指出的那样,同样的错误也存在于Queue::print
.除非你绝对必须,否则不要new
,所有new
都必须在某处有相应的delete
。
使用指针后,将其删除,然后将其设置为 NULL
。例:
char* PotionTypeString(PotionType type)
{
char* s = "UNKNOWN";
switch (type) {
}
return(s);
}
int main()
{
Queue q;
q.enqueue(WISDOM);
q.dequeue();
delete s;
s = NULL;
#ifdef _WIN32
#endif
return 0;
}
当然,要做到这一点,s
必须在PotionTypeString()
之外声明,以免超出范围。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏