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

C++检查未定义变量时IsEmpty函数判断异常问题求助

问题分析与修复方案

嘿,我一眼就揪出了导致你IsEmpty判断失效的核心问题,再顺带帮你优化下代码里的其他潜在坑:

1. 致命错误:Stack构造函数的赋值逻辑错误

先看你的Stack类构造函数:

Stack(){ this->head == NULL; }

这里你用了相等运算符==,这只是做了一次无意义的比较操作,根本没把head赋值为NULL!这就导致stack->head从一开始就是个随机的垃圾内存地址,后续所有依赖head的判断全乱了。

正确的写法应该用赋值运算符=,或者更规范的初始化列表:

// 方式1:直接赋值
Stack(){ this->head = NULL; }
// 方式2:初始化列表(更推荐)
Stack() : head(NULL) {}

2. IsEmpty函数的设计优化

你的IsEmpty是Stack的成员函数,但却要外部传一个StackNode*参数,这完全没必要——Stack自己就持有head,应该自己判断是否为空:

bool IsEmpty(){
    return head == NULL;
}

调用的时候直接用stack->IsEmpty()就行,不用再传temp参数了。

3. 内存泄漏隐患:isItExiteInStack里的多余new

看这段代码:

StackNode * temp = new StackNode();
temp = stack->head;

你先new了一个StackNode,然后立刻把temp指向stack->head,导致new出来的节点完全没被使用,直接造成内存泄漏!应该直接初始化temp:

StackNode * temp = stack->head;

4. 修正后的关键代码片段

修正后的Stack类

class StackNode{ 
public: 
    StackNode(){ 
        this->varName = NULL; 
        this->down = NULL; 
    } 
    char * varName; 
    StackNode * down; 
}; 

class Stack{ 
public: 
    StackNode * head; 
    // 修复构造函数的赋值错误
    Stack() : head(NULL) {} 
    // 优化后的IsEmpty函数
    bool IsEmpty(){
        return head == NULL;
    }
    // 补全你用到的AddUnite函数(原代码未实现,确保它正确将节点压入栈顶)
    void AddUnite(char* varName){
        StackNode* newNode = new StackNode();
        newNode->varName = varName;
        newNode->down = head;
        head = newNode;
    }
};

修正后的isItExiteInStack函数

bool ST::isItExiteInStack(StNode * node, Stack * stack){ 
    StackNode * temp = stack->head; 
    while(!stack->IsEmpty() && temp != NULL){ 
        if(strcmp(temp->varName, node->VarName) == 0){ 
            return true; 
        } 
        temp = temp->down; 
    } 
    return false; 
}

额外提醒

  • 内存管理:你的代码里大量使用new,记得在栈不再使用时遍历所有节点执行delete,避免内存泄漏。
  • 字符串安全:varName用char*容易出现野指针问题,建议换成std::string,更安全省心。
  • 变量名一致性:原代码里有VarName和varName大小写混用的情况,尽量保持统一,避免拼写错误。

内容的提问来源于stack exchange,提问作者Abdul Rahman Al Hourani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:08:02