c++ - 为什么我可以访问我刚刚从 C++ 中的 STL vector 中删除的元素?

标签 c++ stl vector erase

在这个例子中,我创建了一个包含一个整数的 vector ,然后我从 vector 中删除了这个整数。 vector 的大小变小了,但整数还在!为什么整数还在那里?大小为 0 的 vector 怎么可能包含元素?

#include <vector>
#include <iostream>

using namespace std;

int main(int agrc, char* argv[])
{
    vector<int> v;
    v.push_back(450);

    cout << "Before" << endl;
    cout << "Size: " << v.size() << endl;
    cout << "First element: " << (*v.begin()) << endl;
    v.erase(v.begin());
    cout << "After" << endl;
    cout << "Size: " << v.size() << endl;
    cout << "First element: " << *(v.begin()) << endl;

    return(0);
}

输出:

Before
Size: 1
First element: 450
After
Size: 0
First element: 450

最佳答案

您正在通过取消引用无效的内存位置来调用未定义的行为。通常,出于效率目的,堆管理器不会立即释放使用 delete 删除的内存。但是,这并不意味着您可以访问该内存位置,堆管理器可以随时将此内存位置用于其他目的。因此,如果您取消引用无效的内存位置,您的程序将表现出不可预测的行为。

关于c++ - 为什么我可以访问我刚刚从 C++ 中的 STL vector 中删除的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5401635/

相关文章:

c++ - 什么属于 "Data Oriented Design"?

c++ - 在 Visual Studio C++ 中初始化 std::string 数组时崩溃

c++ - boost::lambda : _1 不是类或命名空间

c++ - STL SET 中项目的顺序因程序的不同运行而不同

c++ - 在 Rcpp 和 C++ 之间转换 vector (使用 Rcpp::as 或 Rcpp::wrap)是否会创建一个新 vector 并复制元素?

c++ - 缓冲区溢出 :codesonar warning

c++初始化一个带有数组的结构类型

c++ - STL算法返回类型强制转换,不会造成数据丢失

c++ - 将迭代器转换为指针?

arrays - 将元胞数组中的 double 插入 MATLAB 中的向量