gpt4 book ai didi

c++ - vector 中的删除方法

转载 作者:行者123 更新时间:2023-11-28 05:21:15 25 4
gpt4 key购买 nike

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

  1. nullptr 是如何附加到第一个 vector 的?
  2. 为什么允许将迭代器应用于第二个 vector ?
  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 << " construction\n";}
const string& get_name() const {return name;}
~A() {cout <<get_name() << " destruction\n";}
A (const A& rhs) : name(rhs.name){cout << "A copy constructor\n";}
A(A&& rhs) : name(""){
cout <<"A move constructor\n";
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); 行失败并显示消息; 迭代器越界,确实如此。

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

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

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

关于c++ - vector 中的删除方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41455468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com