关于这一点的奇怪之处在于我的代码使用mingw编译器编译得很好,但是当我将我的项目转移到visual studio express时,我无法运行/调试我的代码到目前为止没有出现此错误警告框:{{3 }}
它说错误是在MSVCP120D.dll的第1685行,这完全让我感到困惑。这是我在项目中实现的最新代码,它导致警告错误开始弹出。
SYA::SYA(std::string p_input) {
std::vector<std::string> infix = inputToInfix(p_input);
for (std::size_t i = 0; i < infix.size(); i++)
std::cout << infix[i] << "\n";
}
std::vector<std::string> SYA::inputToInfix(std::string p_input) {
std::vector<std::string> infix;
std::size_t prevPos = 0, pos = 0;
while (pos != std::string::npos) {
pos = p_input.find_first_of("+-*/%^", prevPos);
if (pos > prevPos)
infix.push_back(p_input.substr(prevPos, pos - prevPos));
infix.push_back(std::string(1, p_input[pos]));
prevPos = pos + 1;
}
return infix;
}
我仔细检查了我的代码,并且我确定我没有使用迭代器出错并超出字符串的范围,而且它对我来说很奇怪错误说它在MSVCP120D.dll的第1685行,我没有使用mingw之前使用相同代码的问题。谁能给我一些见解?如何让这个错误停止出现?
答案 0 :(得分:1)
std::string::npos
通常是(size_t) -1
。但它是正数,因为size_t
是无符号的,在32位机器中它是0xffffffff
所以(pos > prevPos)
总是正确的(在pos
之后{ {1}},npos
将设置为prevPos
又名npos + 1
)
它死在这里
0
当infix.push_back(std::string(1, p_input[pos]));
为pos
时。对于处理器,singed和unsigned之间没有区别,它只是试图获得std::string::npos
。这将始终有效,因为数组在它们之前总是有一点空间,这就是它在MinGW上工作的原因。另一方面,您试图获取p_input[-1]
的{{1}}元素,这显然是不可能的,因此MSVC运行时在检查边界时会抛出错误。