MSVS Express警告:' Debug Assertion Failed,字符串下标超出范围'

时间:2014-06-20 16:34:56

标签: c++ visual-studio

关于这一点的奇怪之处在于我的代码使用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之前使用相同代码的问题。谁能给我一些见解?如何让这个错误停止出现?

1 个答案:

答案 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运行时在检查边界时会抛出错误。