创建队列时程序偶发崩溃问题排查(Visual Studio 2017环境)
你的程序偶发崩溃的核心原因
我一眼就看到了你CreateQueue函数里的一个致命错误,这大概率就是导致偶发崩溃的元凶:
QueueHead *myQH = (QueueHead*)malloc(sizeof(myQH));
你这里用了sizeof(myQH),但myQH是一个指针变量——在32位系统下它的大小是4字节,64位系统是8字节,而QueueHead结构体的大小显然比这个大(包含一个int和两个指针)。这就导致你只分配了指针大小的内存,却要往里面存整个结构体的数据,属于内存越界写入,这种行为是典型的未定义行为:有时候看起来能正常运行,有时候就会直接崩溃,这也解释了为什么在线编译器偶尔没问题,而VS2017下会偶发崩溃(不同环境的内存布局、内存检查机制差异很大)。
修复方法
把malloc的参数改成sizeof(QueueHead),这样才能分配足够容纳整个队列头结构体的内存:
QueueHead *myQH = (QueueHead*)malloc(sizeof(QueueHead));
另外,记得在分配内存后检查是否成功(防止malloc返回NULL),这是非常重要的编程习惯:
QueueHead *CreateQueue(){ QueueHead *myQH = (QueueHead*)malloc(sizeof(QueueHead)); if (myQH == NULL) { // 内存分配失败的处理逻辑,比如返回NULL或者打印报错信息 return NULL; } // 别忘了初始化队列的成员变量 myQH->count = 0; myQH->front = NULL; myQH->rear = NULL; return myQH; }
为什么在线编译器没崩溃?
在线编译器的内存环境和本地VS2017不一样,可能刚好在你越界写入的位置没有其他关键数据,或者它的内存安全检查没有VS严格。但未定义行为的本质就是不可预测,这次没崩溃不代表问题不存在,必须修复这个内存分配的错误。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

