C++の基本的なメモリ管理の原則を理解するのに問題があります。このコードは、迷路ファイルを2Dベクトルに読み込む関数の一部であるループの一部です。メモリ管理Confusion 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クラスは
class MazeNode
{
public:
void setType(char c);
char getChar();
NodeType type;
vector<Direction> visitedFrom;
vector<node*> verts;
};
そして、ノードクラス
(また、構造体のようなeverythign公衆を作り、このクラスを書くことで私のlazynessを言い訳)(「T」が何であるかである)です。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の定義を追加してください。 – ebo
それは私が思ったものですが、なぜ私はちょうど削除を使用するとエラーが発生するのですか? – Slims