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

标签 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 的函数时。 偶然我想知道 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/

相关文章:

c++ - 为什么项目依赖会影响链接器设置

c++ - 使用 map<int, Foo> 而不是 vector<Foo> 来避免指针失效

arrays - 将字符串添加到空数组给出 `NAN`

c++ - 二进制搜索 C++,STATUS_ACCESS_VIOLATION

c++ - Visual Studio 2013 中的替代标记(不,和等...)

c++ - sprintf 等显示函数如何将数字转换为字符串?

c++ - C/C++ NaN 还是 bool 值?

c++ - 为什么 C++ 类名在移动到 VS Code 中的命名空间时不再被语法突出显示?

visual-studio - 如何更改 Visual Studio 2017 许可证 key ?

c++ - Microsoft header 对声明没有评论,那么文档在哪里?