递归回溯迷宫生成:GetNeighbours返回指针失效问题排查
问题原因分析
常见导致这种指针失效的情况主要有以下几种:
返回栈上局部变量的指针/引用
如果GetNeighbours函数内部在栈上定义了坐标对象(比如自定义的Coordinate或Point结构体),然后返回指向该对象的指针,函数执行完毕后栈帧会被销毁,这块内存会被系统回收或覆盖,后续在RecursiveBacktracking中访问时自然会得到错误值。错误示例:
Coordinate* GetNeighbours(int x, int y) { Coordinate neighbor; // 栈上局部变量 neighbor.x = x + 1; neighbor.y = y; return &neighbor; // 返回局部变量的指针,函数结束后立即失效 }返回临时对象的指针
若函数中直接返回临时创建对象的指针(比如通过Coordinate(x,y)这种临时实例),临时对象仅在当前表达式范围内有效,表达式结束后就会被销毁,对应的指针也会变成野指针。错误示例:
Coordinate* GetNeighbours(int x, int y) { return &Coordinate(x + 1, y); // 临时对象指针,返回后立即失效 }动态分配内存的提前释放
如果GetNeighbours用new动态分配了坐标对象,但在RecursiveBacktracking调用前或过程中,这块内存被意外delete,或者没有正确传递所有权(比如函数内部创建后又在某个分支释放了),也会导致指针无效。容器元素指针失效
若GetNeighbours返回的是指向某个容器(比如std::vector)中元素的指针,而该容器在函数返回后发生了扩容、元素删除等操作,容器的内存可能会重新分配,原来的元素指针就会指向无效地址。比如你用std::vector<Coordinate> neighbors存储邻居,然后返回&neighbors[i],函数结束后neighbors被销毁,指针自然失效。
内容的提问来源于stack exchange,提问作者HarrisonO
相关产品推荐
相关产品推荐

