#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v(10,0);
vector<int>::iterator ff = v.begin();
v.assign(3, 11);
cout << *ff << endl;
cin.get();
return 0;
return 0;
}
猜测:
编译器有问题吗? 有什么我不知道的吗?
详细信息:
当我看到在c++ api中分配 vector 的函数时。 偶然我想知道 vector 中分配的存储空间以及是否可以使用迭代器作为指针。 所以我写了这个。 但它错了。我想也许在调用时分配它重新分配内存。 但我用谷歌搜索它。它说
"This causes an automatic reallocation of the allocated storage space if -and only if- the new vector size surpasses the current vector capacity."
显然,功能很大,所以不应该重新分配。我很疯狂,我尝试了 devc++,它很好。为什么?
最佳答案
这是由于在调用 v.assign()
之后使用迭代器时未定义的行为,因为分配会使迭代器无效,因此在调用之后使用迭代器是一个坏主意。
有趣的是,VS 在调用分配后确实重用了相同的底层内存(它仍然具有相同的地址,容量为 10,但新大小为 3),但它有一个名为 Debug Iterators 的功能。 。当此功能打开时,由于默认情况下是调试构建,它会存储有效迭代器的列表,因此知道您的迭代器已失效并很好地告诉您。在更快的发布构建中,它不会运行这些检查,因此它具有未定义的行为,但恰好打印出正确的值。
具有不太复杂的迭代器调试机制的编译器不会这样做,并且您会得到未定义的行为(这以最可怕的方式表现出来 - 通过完全按照您的预期进行)
如果您碰巧存储了指向第一个元素的指针,那么即使调试迭代器也无法帮助您,您可能会得到您期望打印的值,但其行为仍然未定义!
关于c++ - 为什么相同的代码在 Visual Studio 和 Dev-C++ 中运行不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29847619/