【发布时间】:2012-04-16 21:55:27
【问题描述】:
我无法理解 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:谢谢大家。我现在明白了这个问题。我更改了指针对象的向量,以便不再使用指针。
【问题讨论】:
-
您不需要将指针设置为 NULL。这似乎正是导致泄漏的原因。
-
请添加t.verts的定义。
-
我是这么想的,但是如果我只使用 delete 为什么会出错呢?
-
请发布您的
t和temp变量的定义。我很确定导致泄漏的不仅仅是设置为 NULL,但我需要变量定义来显示这里的“全部”错误。 -
Don't use
new, don't usedelete。 C++ 的这些特性并不适合大多数代码。
标签: c++ pointers memory-management dynamic