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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:41:57