C++中vector调整大小仅在添加cout语句时生效的原因是什么?
vector<string> solution(vector<string> inputArray) { int n = inputArray.size(); vector<string> outputString(n); int maxSize, curPos = 0; for(auto &i: inputArray) { int currentSize = i.size(); if(currentSize > maxSize) { maxSize = currentSize; curPos = 0; outputString[curPos++] = i; }else if (currentSize == maxSize) { outputString[curPos++] = i; } } cout<<curPos; outputString.resize(curPos); return outputString; }
核心原因
- 问题的本质是未初始化局部变量触发的未定义行为(UB):代码中定义
int maxSize, curPos = 0;时,仅对curPos赋值为0,maxSize作为栈区的局部非静态变量没有初始化,其初始值是对应内存地址残留的随机垃圾值。 - 删掉
cout<<curPos;行时,编译器优化后的栈内存布局下,maxSize的初始随机值远大于输入数组中所有字符串的长度,导致循环中currentSize > maxSize和currentSize == maxSize两个分支永远无法命中,curPos全程保持0,最后outputString.resize(0)就返回了空vector。 - 添加
cout<<curPos;行时,该行代码改变了栈区的内存布局,maxSize对应的内存地址残留的随机值刚好小于输入数组最长字符串的长度,循环逻辑可以正常触发,curPos可以正常计数,运行结果就看起来“正常”了。
修复方案
只要给maxSize设置初始值即可彻底解决问题,将变量定义行修改为:int maxSize = 0, curPos = 0;
这种未定义行为的典型特征就是看似完全无关的代码改动会影响最终运行结果,没有稳定的复现规律,根源都是代码存在内存或语法层面的不规范写法。
内容的提问来源于stack exchange,提问作者Joel D'Souza
相关产品推荐
相关产品推荐

