矢量中的擦除方法

Erase Method in Vector

本文关键字:擦除 方法      更新时间:2023-10-16

我正在编写一些代码,其中有 2 个向量分别包含 4 个智能指针。我不小心将第一个向量中生成的迭代器应用于第二个向量中的擦除方法。然后程序崩溃。我了解到复制构造和移动构造涉及擦除方法。根据调试器,我发现 1) 一个 nullptr 和 2 个智能指针保留在第一个向量中。2) 4 个智能指针驻留在第二个向量中。3)程序在几次成功运行后开始崩溃。我的问题如下,

  1. 如何将 nullptr 附加到第一个向量?
  2. 为什么允许将迭代器应用于第二个向量?
  3. 为什么程序从一开始就没有崩溃?

顺便说一句,我的平台是Xcode 8.1。提前致谢

#include <memory>
#include <vector>
#include <iostream>
#include <string>
using namespace std;
class A{
public:
    A(string name_) : name(name_) {cout << name << " constructionn";}
    const string& get_name() const {return name;}
    ~A() {cout <<get_name() << " destructionn";}
    A (const A& rhs) : name(rhs.name){cout << "A copy constructorn";}
    A(A&& rhs) : name(""){
        cout <<"A move constructorn";
        swap(rhs);
    }
    void swap(A& rhs) noexcept {
        std::swap(name, rhs.name);
    }
private:
    string name;
};
void foo();
int main(){
    foo();
}
void foo(){
    vector<shared_ptr<A>> vect1, vect2;
    auto a1 = make_shared<A>("Mike");
    auto a2 = make_shared<A>("Alice");
    auto a3 = make_shared<A>("Peter");
    auto a4 = make_shared<A>("Paul");
    vect1.push_back(a1);
    vect1.push_back(a2);
    vect1.push_back(a3);
    vect1.push_back(a4);
    vect2.push_back(a4);
    vect2.push_back(a1);
    vect2.push_back(a2);
    vect2.push_back(a3);
    auto it = vect1.begin();
    vect1.erase(it);
    for (auto &c : vect1){
        cout << c->get_name() << endl;
    }
    vect2.erase(it);
    for (auto &c : vect2){
        cout << c->get_name() << endl;
    }
}

在VS2015中,它在线vect2.erase(it);失败并显示消息;迭代器越界,确实如此。

正如您在问题中所述it甚至不属于vect2.

即使它在您的平台上工作,它也是未定义的行为。所以从那以后,任何事情都可能发生。

你不再在 c++ 标准中工作,你现在正在处理你的平台实现的任何方式(也许它使用指针作为迭代器,也许它使用偏移量;谁知道呢?)。