C++类模板实现求助:ArrayStack构造函数无法访问数组
问题排查与修复:ArrayStack类模板构造函数错误及其他问题
核心问题定位
你的代码核心故障来自构造函数的错误实现,同时还有几处潜在问题:
- 成员变量未正确初始化:构造函数内的
T array[10];是局部栈数组,和类的成员指针T* array重名,不仅没初始化成员变量,局部数组还会在构造函数结束后销毁;注释的T *array = new T[s];也是局部指针,同样没有给类成员array赋值,导致成员array始终是野指针,后续push/top等操作会访问非法内存。 - 参数被无效覆盖:构造函数里
s = 10;直接覆盖传入参数,既然构造函数已经声明默认参数int s = 10,这行代码完全多余,还会导致用户自定义容量失效。 - 未处理边界情况:
pop/top函数在栈空时无返回值,属于未定义行为;push函数栈满时无提示;main函数未处理中间出现栈空时的右括号场景。 - 内存泄漏风险:用
new分配的内存没有对应delete,会造成内存泄漏。
分步修复方案
1. 修正构造函数
改为正确初始化成员变量的版本,推荐使用初始化列表(更高效):
template <typename T> ArrayStack<T>::ArrayStack(int s) : capacity(s), count(0), array(new T[s]) { // 空函数体即可 }
如果要保留默认参数的逻辑,也可以直接在初始化列表处理,无需修改传入参数。
2. 添加析构函数避免内存泄漏
在类的public区域声明析构函数,然后实现:
// 类内声明 ~ArrayStack(); // 类外实现 template <typename T> ArrayStack<T>::~ArrayStack() { delete[] array; }
为避免浅拷贝问题,建议禁用拷贝构造和拷贝赋值:
// 类内public区域添加 ArrayStack(const ArrayStack&) = delete; ArrayStack& operator=(const ArrayStack&) = delete;
3. 修复pop/top的未定义行为
添加边界判断并抛出异常(需包含<stdexcept>头文件):
#include <stdexcept> template <typename T> T ArrayStack<T>::pop() { if (count == 0) { throw std::underflow_error("栈为空,无法执行弹出操作"); } return array[--count]; } template <typename T> T ArrayStack<T>::top() { if (count == 0) { throw std::underflow_error("栈为空,无法获取栈顶元素"); } return array[count - 1]; }
4. 完善push的栈满处理
添加栈满判断并抛出异常:
template <typename T> void ArrayStack<T>::push(T t) { if (count == capacity) { throw std::overflow_error("栈已满,无法执行入栈操作"); } array[count++] = t; }
5. 修复main函数的逻辑漏洞
处理中间出现栈空时的右括号场景:
// 处理右括号的分支中添加栈空判断 else { if (stack.isEmpty()) { flag = 0; cout << "非法" << endl; break; } if (stack.top() + *i == 7) stack.pop(); else { flag = 0; cout << "非法" << endl; break; } }
内容的提问来源于stack exchange,提问作者Twinkle
相关产品推荐
相关产品推荐

