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

C++开发中无法访问3D对象cube的对象数组,返回指针ID或nan

问题根因

1. 悬垂指针(访问异常核心原因)

edge类的带参构造函数采用值传递接收vertice参数,iv1、iv2是构造函数内的局部临时对象,构造函数执行结束后这两个对象会被自动销毁,你存储的&iv1、&iv2就变成了野指针,后续访问对应地址时就会出现乱码、nan值或者指针地址输出的异常。

2. 悬垂引用问题

vertice类的operator+和operator-返回的是局部对象temp的引用,temp是函数内部的局部变量,函数返回后就会被销毁,后续使用该引用的位置会触发未定义行为。

3. 数学运算非法导致nan

cube构造函数里的Alph = aprox(asin(3 * sqrt(2) / 3), eps)化简后输入asin的参数是sqrt(2)≈1.414,而asin函数的合法输入范围是[-1, 1],输入超出范围的数值会直接返回nan,后续所有基于这个值的计算结果都会是nan。

4. 边数组初始化不全

初始化eTab的循环只执行了10次,12条边有2条没有完成初始化,访问未初始化的边也会触发异常。

修复方案
// 1. 修改edge类带参构造,直接接收指针指向vTab中的顶点,避免临时对象问题
edge(vertice* iv1, vertice* iv2) {
    v1 = iv1;
    v2 = iv2;
}

// 2. 修改vertice运算符重载,返回值对象而非局部对象的引用
vertice operator- (vertice& orig) {
    vertice temp = *this;
    temp.x -= orig.x;
    temp.y -= orig.y;
    temp.z -= orig.z;
    return temp;
}
vertice operator+ (vertice& orig) {
    vertice temp = *this;
    temp.x += orig.x;
    temp.y += orig.y;
    temp.z += orig.z;
    return temp;
}

// 3. 修正asin输入参数,替换为合法的立方体顶点俯仰角计算逻辑
double Alph = aprox(asin(1.0 / sqrt(3)), eps);

// 4. 修复edge初始化循环边界,补全12条边的初始化
for (int i = 0; i < 12; i++) {
    if (i < 4) {
        eTab[i] = edge(&vTab[i], &vTab[(i + 1) % 4]);
        eTab[i + 4] = edge(&vTab[i], &vTab[i + 4]);
        cout << eTab[i] << eTab[i + 4] << endl;
    } else if(i < 8) {
        eTab[i + 4] = edge(&vTab[i], &vTab[((i + 1) % 4) + 4]);
        cout << eTab[i + 4] << endl;
    }
}

内容的提问来源于stack exchange,提问作者eXway

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 07:24:05