C++ での基本的なメモリ管理の原則を理解するのに苦労しています。このコードは、迷路ファイルを 2D ベクトルに読み込む関数の一部であるループの一部です。
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:みんなありがとう。私は今問題を理解しています。ポインター オブジェクトのベクトルを変更して、ポインターを使用しないようにしました。