为什么我在这里出现内存泄漏

Why am I getting a memory leak here?

本文关键字:内存 泄漏 在这里 为什么      更新时间:2023-10-16

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()之外声明,以免超出范围。