表达式:无法增加值初始化的迭代器(调试时出错,但发布模式时不会 - Visual Studio)
Expression: cannot increment value-initialized iterator (Error in Debug, but not in Release mode - Visual Studio)
我的问题是我的部分代码 运行 在 Release 模式下没有问题,但在 Debug 模式下出现错误。
设置:
C++ 17 -
Visual Studio 2019
为了显示差异我写了一点测试代码:
int main()
{
//Vector containing 20 lists with length of 10 each. Every Element = 10
std::vector<std::list<int>> test(20, std::list<int>(10,10));
std::cout << test[6].front() << std::endl; //test if initialization worked
std::list<int>::iterator test_iter;
for (test_iter = test[6].begin(); test_iter != test[6].end(); test_iter++)
{
std::cout << *test_iter << std::endl;
test[6].erase(test_iter);
}
}
In Release it works fine
But in Debug I get this
有谁知道为什么这两种模式之间存在差异以及我如何调整它,所以调试模式也能正常工作?
提前感谢您的帮助!
此致
大卫
问题不是它在调试中不起作用,而是它似乎在发行版中起作用 - 代码在两者中同样损坏,但库的调试版本有一些额外的错误-校验码。
错误消息有点含糊,但它想表达的是您正在尝试递增无法递增的迭代器。
发生这种情况是因为 test[6].erase(test_iter);
使 test_iter
无效,并且在此之后使用它是未定义的。
erase
returns 指向被擦除元素之后的元素的迭代器,您可以使用此迭代器而不是递增:
for (test_iter = test[6].begin(); test_iter != test[6].end(); /* empty */)
{
std::cout << *test_iter << std::endl;
test_iter = test[6].erase(test_iter);
}
我的问题是我的部分代码 运行 在 Release 模式下没有问题,但在 Debug 模式下出现错误。
设置: C++ 17 - Visual Studio 2019
为了显示差异我写了一点测试代码:
int main()
{
//Vector containing 20 lists with length of 10 each. Every Element = 10
std::vector<std::list<int>> test(20, std::list<int>(10,10));
std::cout << test[6].front() << std::endl; //test if initialization worked
std::list<int>::iterator test_iter;
for (test_iter = test[6].begin(); test_iter != test[6].end(); test_iter++)
{
std::cout << *test_iter << std::endl;
test[6].erase(test_iter);
}
}
In Release it works fine
But in Debug I get this
有谁知道为什么这两种模式之间存在差异以及我如何调整它,所以调试模式也能正常工作?
提前感谢您的帮助!
此致 大卫
问题不是它在调试中不起作用,而是它似乎在发行版中起作用 - 代码在两者中同样损坏,但库的调试版本有一些额外的错误-校验码。
错误消息有点含糊,但它想表达的是您正在尝试递增无法递增的迭代器。
发生这种情况是因为 test[6].erase(test_iter);
使 test_iter
无效,并且在此之后使用它是未定义的。
erase
returns 指向被擦除元素之后的元素的迭代器,您可以使用此迭代器而不是递增:
for (test_iter = test[6].begin(); test_iter != test[6].end(); /* empty */)
{
std::cout << *test_iter << std::endl;
test_iter = test[6].erase(test_iter);
}