C++ クラスのチェッカーのシミュレーション ゲームに取り組んでいます。私の問題は、チェッカーを保持するリンクされたリストにあります。リストの先頭を除いて、すべてのチェッカーを完全に削除できます。ここや他のウェブサイトを見回しましたが、どこかにメモリリークがあると思います。私はC++にかなり慣れていないので、いろいろいじる以外に実際に何をすべきかわかりません(おそらく、より大きな問題を引き起こすだけです)。以前にここに投稿したことがないので、フォーマットが少しずれていたり、乱雑であったりしたらすみません。手短にしようと思います。まず、リンク リストのノード クラスのスニペットを次に示します。
class CheckerpieceNode
{
private:
Checkerpiece *Node;
CheckerpieceNode *Next;
public:
CheckerpieceNode(); // sets Node and Next to NULL in .cpp file
void setNode(Checkerpiece *node);
void setNext(CheckerpieceNode *next);
Checkerpiece* getNode();
CheckerpieceNode* getNext();
};
関数は、Checkerpiece.cpp クラスで期待されるように設定されています。コードの使用方法は次のとおりです。私のメインクラスのチェッカーボードオブジェクトによって呼び出されます。
theCheckerboard.removeChecker(theCheckerboard.findChecker(selector->getCurrentX() + 0, selector->getCurrentY() - VERTICAL_SHIFT, listHead), listHead);
VERTICAL_SHIFT は、チェッカーボード グラフィックがコンソールに表示される方法に関係しています。他のすべてのノード (ヘッドを除く) で完全に機能するため、エラーの原因として除外しました。Selector はチェッカーピース オブジェクトですが、リストの一部ではありません。
Checkerboard クラスの実際の findChecker および removeChecker コードを次に示します。
Checkerpiece* findChecker(int x, int y, CheckerpieceNode* list_head)
{
if(list_head== NULL) return NULL; // do nothing
else
{
CheckerpieceNode* node = new CheckerpieceNode;
node = list_head;
while(node != NULL && node->getNode() != NULL)
{
if()// comparison check here, but removed for space
{
return node->getNode();
delete node;
node = NULL;
}
else // traversing
node = node->getNext();
}
return NULL;
}
}
void removeChecker(Checkerpiece* d_checker, CheckerpieceNode* list_head)
{
if(list_head== NULL) // throw exception
else
{
CheckerpieceNode *temp = NULL, *previous = NULL;
Checkerpiece* c_checker= new Checkerpiece;
temp = list_head;
while(temp != NULL && temp->getNode() != NULL)
{
c_checker= temp->getNode();
if(d_checker!= c_checker)
{
previous = temp;
temp = temp->getNext();
}
else
{
if(temp != list_head)
{
previous->setNext(temp->getNext());
delete temp;
temp = NULL;
}
else if(temp == list_head) // this is where head should get deleted
{
temp = list_head;
list_head= list_head->getNext();
delete temp;
temp = NULL;
}
return;
}
}
}
}