You need to enable JavaScript to run this app. 使用C++模板实现类型无关堆栈时首元素输出异常问题求助
优惠活动
大模型
产品
解决方案
定价
更多

使用C++模板实现类型无关堆栈时首元素输出异常问题求助

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

按上述改动完成后,主函数里依次入栈1-6再调用print,就会输出完全符合预期的6 5 4 3 2 1,不会再出现数值被随机覆盖的异常。

内容的提问来源于stack exchange,提问作者pacours

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 16:24:09