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
相关产品推荐
相关产品推荐

