我无法理解 C++ 中的一些基本内存管理原则。此代码是循环的一部分,循环是将迷宫文件读入二维向量的函数的一部分。
根据 Valgrind 的说法,以下代码导致内存泄漏......
请注意,它t
是一个MazeNode
对象,并且verts
是t
类中的一个向量,其中包含指向节点对象的指针(不要与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;
最初我在删除它们之前没有将每个指针设置为 NULL,但会出现分配错误。所以我只是将它们设置为 NULL 并且我的代码有效。我想我真的很困惑为什么这会导致内存泄漏以及为什么我需要将指针设置为 NULL。可能有一种更简单的非指针方法可以做到这一点,但也许这个问题会帮助我更好地理解内存管理。
谢谢大家。
编辑:这是 MazeNode 类(这就是“t”)(也请原谅我写这个类的懒惰,让一切都像结构一样公开)
class MazeNode
{
public:
void setType(char c);
char getChar();
NodeType type;
vector<Direction> visitedFrom;
vector<node*> verts;
};
和节点类:
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;
};
EDIT2:谢谢大家。我现在明白了这个问题。我更改了指针对象的向量,以便不再使用指针。