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

传递类对象数组至其他类对象时仅能读取首个元素的问题

问题分析与解决:类对象指针数组传递异常

核心问题1:指针数组的保存逻辑错误

你在statusClass::setValues里的赋值逻辑完全错误:

array = *_array;

_array是指向指针数组的指针(const dataClass**),*_array取到的是数组第一个元素的地址(也就是&prueba0),这导致statusClass里的array只保存了单个对象的指针,而非整个指针数组的起始地址。后续访问array[1]本质是对单个指针做越界偏移,读取的是无效内存,自然得不到正确结果。

核心问题2:局部对象的悬垂指针风险

settingUp函数里的prueba0、prueba1、prueba2是栈上的局部对象,函数执行完毕后这些对象会被销毁。statusClass里保存的指针会变成悬垂指针,后续任何对这些指针的访问都会触发未定义行为(比如程序崩溃、输出乱码)。

修正后的代码示例

1. 修正statusClass的指针保存逻辑

假设statusClass的成员变量array定义为const dataClass**,修改setValues:

// statusClass.cpp
void statusClass::setValues(uint8_t _statusSelectorByte, const dataClass** _array) {
    newStatusSelectorByte = _statusSelectorByte;
    array = _array; // 直接保存指针数组的地址,而非第一个元素
};

void statusClass::printValues() {
    printf("TP: statusClass -> printValues: Prueba = %d\n", newStatusSelectorByte);
    // 现在通过指针数组访问第二个元素的length,注意用->访问指针成员
    printf("TP: statusClass -> printValues: arrayPrueba[1] length = %d\n", array[1]->length);  
}

2. 修复dataClass的printValues错误

你当前的print函数里输出了&length(变量地址),应该直接输出变量值:

// classData.cpp
void dataClass::printValues() const {
    printf("TP: dataClass: length = %d\n", length); // 去掉&
};

3. 解决悬垂指针问题

有两种常见方案:

  • 方案A:使用动态分配对象
    在settingUp里用new创建对象,确保生命周期不受函数栈影响(记得后续要delete避免内存泄漏):

    // settingUp.cpp
    void settingUp(){
        const dataClass* arrayPrueba[3];
        arrayPrueba[0] = new dataClass();
        arrayPrueba[1] = new dataClass();
        arrayPrueba[2] = new dataClass();
    
        arrayPrueba[0]->setValues(1);
        arrayPrueba[1]->setValues(2);
        arrayPrueba[2]->setValues(3);
    
        statusClass status;
        status.setValues(1, arrayPrueba);
        status.printValues();
    
        // 用完后释放内存
        delete arrayPrueba[0];
        delete arrayPrueba[1];
        delete arrayPrueba[2];
    }
    
  • 方案B:使用全局/静态对象
    如果是嵌入式场景不想用动态分配,可以把对象声明为静态:

    // settingUp.cpp
    void settingUp(){
        static dataClass prueba0;
        static dataClass prueba1;
        static dataClass prueba2;
    
        const dataClass* arrayPrueba[3];
        prueba0.setValues(1);
        prueba1.setValues(2);
        prueba2.setValues(3);
    
        arrayPrueba[0] = &prueba0;
        arrayPrueba[1] = &prueba1;
        arrayPrueba[2] = &prueba2;
    
        statusClass status;
        status.setValues(1, arrayPrueba);
        status.printValues();
    }
    

    静态对象的生命周期从第一次初始化到程序结束,不会出现悬垂指针问题。

内容的提问来源于stack exchange,提问作者David Moreno García

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:05:13