C++ MSV Express警告:';调试断言失败,字符串下标超出范围';

C++ MSV Express警告:';调试断言失败,字符串下标超出范围';,c++,visual-studio,C++,Visual Studio,奇怪的是,我的代码使用mingw编译器编译得很好,但当我将项目转移到visual studio express时,如果没有弹出此错误警告框,我无法运行/调试我的代码: 它说错误在MSVCP120D.dll的1685行,这让我完全困惑。下面是我在项目中实现的最新代码,它导致出现警告错误 SYA::SYA(std::string p_input) { std::vector<std::string> infix = inputToInfix(p_input); for (std:

奇怪的是,我的代码使用mingw编译器编译得很好,但当我将项目转移到visual studio express时,如果没有弹出此错误警告框,我无法运行/调试我的代码:

它说错误在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";
SYA::SYA(std::string p_输入){
标准::向量中缀=输入固定(p_输入);
对于(std::size_t i=0;istd::cout
std::string::npos
通常是
(size\u t)-1
。但它是一个正数,因为
size\u t
是无符号的,在32位机器中它是
0xffffff
所以
(pos>prevPos)
总是正确的(在
pos
was
npos
之后,
prevPos
将设置为
npos+1
a.k.a.
0

它死在这里

infix.push_back(std::string(1, p_input[pos]));

pos
std::string::npos
时。对于处理器,有符号和无符号之间没有区别,它只是尝试获取
p_输入[-1]
。这将始终有效,因为数组前面总是有一点空间,这就是它在MinGW上工作的原因。另一方面,您试图获取
p\u input
0xffffff
-第四个元素,这显然是不可能的,因此MSVC运行时在检查边界时会抛出错误。

“我仔细检查了我的代码…”调用调试器并单步执行??很可能是
pos
由于
p\u输入而变成
-1
No?我使用了提供的调试器并试图破译错误,但正如你可能知道的那样,我对C++/Visual Studio不是最有经验的,所以我不能从中获得太多。我不知道该怎么做,我在谷歌上搜索了很多,但只发现了不适用于我的类似错误消息。我说逐步使用调试器呃,不解释抛出的异常并自动启动调试器。你混淆了一些东西…检查文档。你认为
std::string::npos
实际上是什么?!?
infix.push_back(std::string(1, p_input[pos]));