删除向量中的指针后出现意外行为

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)

有没有人对第一个输出有解释?

Gri*_*han 6

因为删除后您访问内存会导致未定义的行为:

delete p1;
std::cout << *vec[0] << std::endl;  <-- Buggy code
Run Code Online (Sandbox Code Playgroud)

未定义的行为: - 不保证它将如何工作


Jim*_*ion 5

它重新分配所持的空间p1,它vec[0]仍然指向,因此,200这显示了价值.

正如您所注意到的,这是一个编译器的行为,另一个编译器的行为不同.您可能还有其他基于不同优化开关的行为.总的来说,行为是不确定的,尽管我们有时可以弄清楚在特定情况下发生了什么.