You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 14:15:06