在GLUT中访问UAV对象数组:主循环读取初始化值异常求助
问题根源
你在全局作用域执行new ECE_UAV[numUAVs]的时机存在错误:C++的全局变量初始化早于main函数执行,此时numUAVs还未被赋予正确的数量值,本质上分配了一块大小完全不符合预期的内存,后续main函数里的初始化操作已经触发内存越界访问,属于未定义行为,因此进入GLUT主循环后读取到的都是无效值。
修复方案
1. 修改全局数组声明
不要在全局作用域直接分配数组,仅声明指针,内存分配操作移到main函数内执行:
// 全局只声明指针,不分配内存 ECE_UAV* uavs = nullptr;
2. main函数内先分配数组再初始化
在main函数的UAV初始化循环之前,先完成数组的内存分配,确保此时numUAVs已经是正确取值:
int main(int argc, char** argv) { cout << "Entering main method..." << endl; // 先分配正确大小的数组 uavs = new ECE_UAV[numUAVs]; // 再执行UAV位置初始化 for (int i = 0; i < numUAVs; i++) { double x = i % 3 * 24.4 - 24.4; double y = i / 3 * 27.5 - 55.0; double z = 0; uavs[i].initLocation(x, y, z); cout << "UAV " << i << " Initialized to {" << uavs[i].getX() << ", " << uavs[i].getY() << ", " << uavs[i].getZ() << "}" << endl; } mainOpenGL(argc, argv); // 程序退出前释放内存 delete[] uavs; return 0; }
可选优化
如果不想手动管理内存,可以把全局裸指针替换为std::vector<ECE_UAV>,安全性更高:
// 全局声明 #include <vector> std::vector<ECE_UAV> uavs; // main内初始化逻辑 int main(int argc, char** argv) { cout << "Entering main method..." << endl; uavs.resize(numUAVs); for (int i = 0; i < numUAVs; i++) { // 原有初始化逻辑保持不变 } // 其余逻辑保持不变 }
内容的提问来源于stack exchange,提问作者kate
相关产品推荐
相关产品推荐

