内存管理混乱C++

Sli*_*ims 2 c++ pointers memory-management dynamic

我无法理解C++中的一些基本内存管理原则.此代码是循环的一部分,循环是将迷宫文件读入2D矢量的函数的一部分.

根据Valgrind的说法,以下代码导致内存泄漏......

注意,它t是一个MazeNode对象,vertst类中的一个向量,它包含指向节点对象的指针(不要与MazeNode对象混淆):

node* top = new node(TOP, rowCount, i, t.type);
node* bot = new node(BOTTOM, rowCount, i, t.type);
node* left = new node(LEFT, rowCount, i,  t.type);
node* right = new node(RIGHT, rowCount, i, t.type);

t.verts.push_back(top);
t.verts.push_back(bot);
t.verts.push_back(left);
t.verts.push_back(right);

temp.push_back(t);

top = NULL;
bot = NULL;
left = NULL;
right = NULL;
delete top;
delete bot;
delete left;
delete right;
Run Code Online (Sandbox Code Playgroud)

最初我没有在删除它们之前将每个指针设置为NULL,但是会出现分配错误.所以我只是将它们设置为NULL并且我的代码可以工作.我想我真的很困惑为什么这会导致内存泄漏以及为什么我需要将指针设置为NULL.有一种方法可以更轻松地执行此非指针方式,但也许这个问题可以帮助我更好地理解内存管理.

感谢大家.

编辑:这是MazeNode类(这就是't')(也可以原谅我在编写这个类时的懒惰,让每个公共像结构一样公开)

class MazeNode 
{
public:
    void setType(char c);
    char getChar();

    NodeType type;
    vector<Direction> visitedFrom;

    vector<node*> verts;
};
Run Code Online (Sandbox Code Playgroud)

和节点类:

class node
{
public:
    node();
    node(Direction d, int r, int c, NodeType t);
    ~node(); //empty definition
    node(const node* n);
    node& operator=(const node& n);

    void addAdj(node* a, int w);
    void printAdj() const;
    string direction() const;

    void print() const;
    bool operator<(const node& n) const;


    int distance; //from start
    bool visited;
    node* prev;
    vector<Edge> adj;
    Direction dir;
    int row, col;
    NodeType type;
};
Run Code Online (Sandbox Code Playgroud)

EDIT2:谢谢大家.我现在明白了这个问题.我更改了指针对象的向量,以便我不再使用指针.

Jir*_*ika 9

在添加空赋值之前,您的代码存在一个与内存泄漏不同(更糟糕)的问题:存储并且可能还使用了一个指针,即一个指向解除分配内存的指针.

通过添加空赋值使其成为内存泄漏使其更好,但并不多.

真正的解决方案是在你对它们调用delete之后不要在任何地方保留任何指针.也就是说,不要push_back或不要delete在这里.