我是一名普通学生,正在尝试编写蒙特卡罗树搜索代码。
为了做到这一点,我创建了一个名为“Node”的结构,并尝试使用“new”创建新的Node *指针并为它们分配内存,但是我的程序一直在崩溃,我会非常感谢一些帮助。
这是我的代码的样子。标记失败的位置。
提前谢谢。
Node* knell;
Node* treePolicy(Node* currentnode){
puts("treepolicy");
Node* temp=(Node*)malloc(sizeof(Node));
puts("Mem Allocated");
Move save=MCTBoard.generateRandomLegalMove(currentnode->player); ///works very well up to here.
save.printMove();
temp=findNode(currentnode,save);
puts("Node Found");
knell=new Node;
if(temp==NULL){
free(temp);
temp = new Node; ///crashes the second time treePolicy(Node*) is called.
temp->setMove(save);
temp->child.clear();
currentnode->child.push_back(temp);
temp->parent=currentnode;
MCTBoard.playMove(save,currentnode->player);
for(int i=0;i<4;i++){
for(int j=0;j<=i;j++){
for(int k=0;k<=i;k++){
temp->board[i][j][k]=MCTBoard.a[i][j][k];
}
}
}
temp->value=temp->visited=temp->win=temp->draw=0;
temp->player=3-currentnode->player;
knell=temp;
//delete temp; -> even with this enabled, still crashes.
return knell;///an infinite loop happens here, but that is another problem so...
}
else{
///not important,and besides,I've not even reached here yet once.
}
}
实际上在另一个函数中确实存在同样的问题,但我觉得这是另一个问题。
那么,任何人都可以告诉我它崩溃的原因吗?
答案 0 :(得分:2)
让我们来看看temp
的生命周期。
您使用malloc
分配内存。
Node* temp=(Node*)malloc(sizeof(Node));
然后您通过以下函数的返回值覆盖temp
。
temp = findNode(currentnode,save);
然后您使用free
删除它。
free(temp);
从free
返回使用findNode
释放的内存。崩溃的最可能原因是函数返回使用new
而不是malloc
分配的内存。
答案 1 :(得分:1)
几条评论:
Node* knell;
为什么要使knell
成为全局变量?为什么不处理函数外部的全局赋值(可能看起来像:
knell = treePolicy(currentNode);
)或类似的东西
Node* treePolicy(Node* currentnode){
puts("treepolicy");
Node* temp=(Node*)malloc(sizeof(Node));
没有理由在这里使用malloc。你以后要覆盖,所以让我们删除这一行。
puts("Mem Allocated");
Move save=MCTBoard.generateRandomLegalMove(currentnode->player); ///works very well up to here.
save.printMove();
temp=findNode(currentnode,save);
这里是汽车的好地方。
puts("Node Found");
knell=new Node;
就像我们上面所说,删除它。
if(temp==NULL){
nullptr的好地方
free(temp);
我们刚刚确定temp
为空。无需免费
temp = new Node; ///crashes the second time treePolicy(Node*) is called.
temp->setMove(save);
temp->child.clear();
currentnode->child.push_back(temp);
temp->parent=currentnode;
MCTBoard.playMove(save,currentnode->player);
for(int i=0;i<4;i++){
for(int j=0;j<=i;j++){
for(int k=0;k<=i;k++){
temp->board[i][j][k]=MCTBoard.a[i][j][k];
}
}
}
temp->value=temp->visited=temp->win=temp->draw=0;
temp->player=3-currentnode->player;
knell=temp;
让我们摆脱这个
//delete temp; -> even with this enabled, still crashes.
return knell;///an infinite loop happens here, but that is another problem so...
好的,现在没有理由退回knell
,只返回temp
。
}
else{
///not important,and besides,I've not even reached here yet once.
}
因此修复后的代码应如下所示:
Node* treePolicy(Node* currentnode){
puts("treepolicy");
Move save=MCTBoard.generateRandomLegalMove(currentnode->player); ///works very well up to here.
save.printMove();
auto temp=findNode(currentnode,save);
puts("Node Found");
if(temp==nullptr){
temp = new Node; ///crashes the second time treePolicy(Node*) is called.
temp->setMove(save);
temp->child.clear();
currentnode->child.push_back(temp);
temp->parent=currentnode;
MCTBoard.playMove(save,currentnode->player);
for(int i=0;i<4;i++){
for(int j=0;j<=i;j++){
for(int k=0;k<=i;k++){
temp->board[i][j][k]=MCTBoard.a[i][j][k];
}
}
}
temp->value=temp->visited=temp->win=temp->draw=0;
temp->player=3-currentnode->player;
return temp;
}
else{
///not important,and besides,I've not even reached here yet once.
}
或者那种效果。