为什么相同的代码在Visual Studio和Dev-C ++中的运行方式不同?

时间:2015-04-24 12:30:35

标签: c++ visual-studio vector iterator dev-c++

#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的功能时。  我想知道在向量中分配的存储空间以及是否可以使用迭代器作为指针。  所以我写这个。  但它错了。我想也许在通话时分配它重新分配内存。 但是我谷歌了。它说。

  

“这会导致分配的存储空间自动重新分配,如果 - 并且仅在新的矢量大小超过当前矢量容量的情况下。”

显然功能很大所以不应该重新分配。我很疯狂,我尝试使用devc ++并且它很好。为什么?

1 个答案:

答案 0 :(得分:2)

这是由于在调用v.assign()之后使用迭代器时未定义的行为,因为赋值使迭代器无效,因此在调用之后使用迭代器是一个坏主意。

有趣的是,VS在调用assign之后会重用相同的底层内存(它仍然具有容量为10但新大小为3的相同地址),但它有一个名为Debug Iterators的功能。启用此功能时,正如默认情况下对于 Debug 构建一样,它会存储一个有效迭代器列表,因此知道您的迭代器已经失效并且很好地告诉您。在更快的 Release 构建中,它不会运行这些检查,因此它具有未定义的行为,但恰好打印出正确的值。

使用不太复杂的迭代器调试机制的编译器不会这样做,你会得到未定义的行为(以最可怕的方式表现出来 - 完全按照你的期望行事)

如果您碰巧存储了指向第一个元素的指针,那么即使Debug Iterators也无法帮助您,您可能 获取您期望打印的值,但仍然未定义行为!