C ++中的内存分配失败(使用new& delete)

时间:2016-06-15 03:57:14

标签: c++ memory memory-management

我是一名普通学生,正在尝试编写蒙特卡罗树搜索代码。

为了做到这一点,我创建了一个名为“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.
}

}

实际上在另一个函数中确实存在同样的问题,但我觉得这是另一个问题。

那么,任何人都可以告诉我它崩溃的原因吗?

2 个答案:

答案 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.
    }

或者那种效果。

相关问题