C++函数返回含数组的vector时外部数据异常问题咨询
问题分析与解决方案
核心问题
你遇到的是典型的栈内存失效导致野指针访问问题:
- 循环内定义的
__int8 bb[64]是栈上的局部数组,每次循环迭代结束后,这块栈内存会被系统回收并复用。 - 你将
bb的指针存入boards向量,本质上存储的是临时栈内存的地址。函数返回后,这些指针指向的内存已经被覆盖,因此外部访问时数据异常;而函数内打印正常是因为当时栈内存尚未被回收。
修复方案
既然要坚持裸指针追求效率,需要把数组分配在堆内存上,避免栈内存被回收。修改后的代码如下:
vector<__int8*> GenerateAllBoards(__int8 b[64], __int8 colour) { vector<__int8*> boards; for (__int8 i = 0; i < 64; i++) { if (b[i] * colour > 0) { vector<__int8> lm = GenerateLegalMoves(b, i); for (size_t j = 0; j < lm.size(); j++) { // 堆分配数组,避免栈内存失效 __int8* bb = new __int8[64]; copy(b, b + 64, bb); move(bb, i, lm[j], false); boards.push_back(bb); } } } return boards; }
关键注意事项
- 内存泄漏防范:堆分配的内存需要手动释放,外部使用完
boards后,必须逐个释放每个指针:auto boards = GenerateAllBoards(your_board, your_colour); // 使用boards处理逻辑 for (auto ptr : boards) { delete[] ptr; // 必须手动释放堆内存 } - 更安全的替代方案:如果不想手动管理内存,可使用
std::unique_ptr<__int8[]>封装指针,既保留裸指针的效率,又能自动释放内存:
这种方式无需手动调用#include <memory> // 需包含头文件 vector<std::unique_ptr<__int8[]>> GenerateAllBoards(__int8 b[64], __int8 colour) { vector<std::unique_ptr<__int8[]>> boards; for (__int8 i = 0; i < 64; i++) { if (b[i] * colour > 0) { vector<__int8> lm = GenerateLegalMoves(b, i); for (size_t j = 0; j < lm.size(); j++) { auto bb = std::make_unique<__int8[]>(64); copy(b, b + 64, bb.get()); move(bb.get(), i, lm[j], false); boards.push_back(std::move(bb)); } } } return boards; }delete[],unique_ptr会在向量销毁时自动释放所有堆内存,性能几乎与裸指针无差异。
内容的提问来源于stack exchange,提问作者Random coder
相关产品推荐
相关产品推荐

