返回后无法保持动态分配的内存一致
Can't keep dynamically allocated memory consistent after return
我正在编写一个国际象棋程序。作为其中的一部分,我编写了一个静态方法,它应该通过使用不同版本的棋盘来递归地操作它的输入,一个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
时立即释放内存,然后返回垃圾。当然,解引用内存会导致访问冲突
- 对具有动态分配的内存和析构函数的类对象的引用
- 调用析构函数以释放动态分配的内存
- 在运行时为动态分配的内存输入值
- 释放动态分配的内存时是否需要执行此额外步骤
- 动态分配字符数组的内存
- 销毁C++中动态分配的内存(数组对象)
- 删除类成员的动态分配内存的最佳方法是什么
- 动态分配的内存构造函数
- 为什么动态分配的内存总是16字节对齐
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 为什么动态分配的两个变量的内存位置不是连续的?
- 为浮点数组动态分配内存
- 动态分配 8 字节的内存
- 包含动态分配内存作为值的映射的取消定位速度有多快?
- STD分配器是否会在堆上动态分配内存?它可以安全地删除内存吗?
- 为什么不能在 Visual C++ 中动态分配堆栈内存?但海湾合作委员会可以做到
- 在C 中动态分配的内存的问题
- 为什么在 C++ 执行删除操作后仍可以访问释放的动态分配的内存
- 对内存动态分配的类不使用"*"的逻辑
- 如果我将内存动态分配给静态变量,我应该释放它还是会自动释放它