传递类对象数组至其他类对象时仅能读取首个元素的问题
问题分析与解决:类对象指针数组传递异常
核心问题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
相关产品推荐
相关产品推荐

