mhj*_*lam 4 c++ pointers vector
我正在尝试使用指针向量并遇到以下行为,我不太明白:
#include <iostream>
#include <vector>
int main()
{
std::vector<int*> vec;
int* p1 = new int;
*p1 = 100;
vec.push_back(p1);
std::cout << *vec[0] << std::endl;
delete p1;
std::cout << *vec[0] << std::endl;
int* p2 = new int;
*p2 = 200;
std::cout << *vec[0] << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用MinGW C++编译器(g ++),这给了我以下输出:
100
5640648
200
Run Code Online (Sandbox Code Playgroud)
当然,vec[0]当删除指针时,实际元素没有被删除,但是注意p2根本没有插入向量中.仍然,打印第一个元素的值会返回这个看似无关的指针的值!此外,稍微重构代码以便p2在删除之前声明p1它不会产生此行为.
为了确保,我还用MSVC++编译了这个,它给了我以下(预期)输出:
100
5484120
5484120
Run Code Online (Sandbox Code Playgroud)
有没有人对第一个输出有解释?
因为删除后您访问内存会导致未定义的行为:
delete p1;
std::cout << *vec[0] << std::endl; <-- Buggy code
Run Code Online (Sandbox Code Playgroud)
未定义的行为: - 不保证它将如何工作
它重新分配所持的空间p1,它vec[0]仍然指向,因此,200这显示了价值.
正如您所注意到的,这是一个编译器的行为,另一个编译器的行为不同.您可能还有其他基于不同优化开关的行为.总的来说,行为是不确定的,尽管我们有时可以弄清楚在特定情况下发生了什么.
| 归档时间: |
|
| 查看次数: |
174 次 |
| 最近记录: |