返回后无法保持动态分配的内存一致

Can't keep dynamically allocated memory consistent after return

本文关键字:内存 动态分配 返回      更新时间:2023-10-16

我正在编写一个国际象棋程序。作为其中的一部分,我编写了一个静态方法,它应该通过使用不同版本的棋盘来递归地操作它的输入,一个Piece * board[8][8],并在std::unique_ptr中传递"最佳"版本的棋盘的位置,这是该方法的返回类型。

Node定义如下:

class node
{
    public:
    node();
    ~node();
    std::unique_ptr<node> l;
    std::unique_ptr<node> r;
    std::unique_ptr<node> m;
    node * best;
    int bestval;
    Piece * (*board)[8];
};

目标是最终使初始调用递归方法的结果包含一个"最佳"值,该值连接到整个棋盘上的最佳路径选择链。然后,我将画出结果的一系列棋盘状态。

作为其中的一部分,董事会必须保留。在每个递归步骤中胜出的棋盘被复制到动态内存中,返回的棋盘指针(节点声明中的Piece * (*board)[8])被设置为这个动态分配的内存。

这样做:

    std::unique_ptr<node> ret (new node);
    Piece *** reboard = new Piece**[8];
    for (int i = 0; i < 8; i++)
    {
        reboard[i] = new Piece*[8];
    }
    ...code to copy values to reboard and set other ret property values...
    ret->board = reboard;
    return ret;

获胜棋盘的所有局部值随后被复制到重棋盘。这一切都很好。如果我在这个阶段将reboard的所有值复制到全局板,返回并直接将全局板绘制到屏幕上,它将绘制正确的结果。同样,如果我设置ret->board指向全局板,然后将值复制到全局板并返回,它会绘制正确的值。

但是,如果我做我上面写的,并试图画ret->板,我得到无效的内存访问错误在我的绘制方法,我拉我的头发试图把这个问题。似乎在返回后,reboard所指向的内存立即被回收。在这个只能是数据的内存中,我看到数组中的条目似乎指向msctf.dll中的代码,以及其他无效的数据指针。我认为它正在被垃圾收集回收,所以我甚至尝试在任何我能看到的每个指针上放入一些std::declare_reachable调用,但这并没有帮助。

有人注意到这是怎么回事吗?在我释放它之前,动态分配的内存不应该一直存在吗?

std::unique_ptr是一个智能指针,它通过指针保留对象的唯一所有权,并在unique_ptr超出作用域时销毁该对象。没有两个unique_ptr实例可以管理同一个对象。

来源:cppreference.com

换句话说,您在到达return时立即释放内存,然后返回垃圾。当然,解引用内存会导致访问冲突