使用C++模板实现类型无关堆栈时首元素输出异常问题求助
故障根因
- 最核心的问题是栈的存储数组根本没有申请有效内存:
类内声明的T arr[]是未指定长度的柔性数组成员,本身无法直接作为动态存储容器使用;构造函数里写的arr[arraySize]只是一次无意义的下标访问,不会触发任何内存分配。后续所有对arr[i]的读写全都是野指针操作,内存地址完全随机。你观察到的首位入栈值被覆盖成6,本质就是野指针写入时刚好把之前存1的位置覆盖成了6,和栈的出栈顺序逻辑无关。 - 其他实现疏漏:
- 类对
StackI<T>的继承默认是私有继承,若要实现接口多态需要调整为公共继承 - print函数没有加元素分隔空格,就算内存问题修复,输出也会是无间隔的连写格式
- 类对
修复步骤
- 把存储数组的成员类型从无长度的数组改成指针,才能配合动态内存申请:把类里的
T arr[]替换为T* arr; - 重写构造函数,删掉完全没用的
arr[arraySize]语句,改为在堆上申请对应容量的连续内存,同时补充析构函数释放内存避免泄漏:Stack(int arraySize){ this->arraySize = arraySize; this->arr = new T[arraySize]; // 真正申请连续存储块 elements = 0; position = 0; } ~Stack() { delete[] arr; // 释放堆内存 } - 修改print函数的输出逻辑,加元素间的空格分隔,匹配预期输出格式:
void print(){ for (int i = position - 1; i >= 0; i--){ cout << arr[i]; if (i != 0) cout << " "; // 元素间加空格,末尾不额外补空格 } } - (可选补全)把类的继承权限改成公共继承,满足接口实现的多态要求:
class Stack : public StackI<T> { // 原有类成员保持不变 };
修复后效果
按上述改动完成后,主函数里依次入栈1-6再调用print,就会输出完全符合预期的6 5 4 3 2 1,不会再出现数值被随机覆盖的异常。
内容的提问来源于stack exchange,提问作者pacours
相关产品推荐
相关产品推荐

