Fork me on GitHub

版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | https://vearne.cc

警告: 此文章对读者没有价值

遇到的问题

#include <iostream>
#include <vector>
using namespace std;

class Car {
public:
    int age;
    Car(int a) : age(a) { cout << "Car():" << age << endl; }
    ~Car() { cout << "~Car():" << age << endl; }
};

int main() {
    vector<Car *> v;
    for (int i = 0; i < 10; i++) {
        Car tmp(i);
        v.push_back(&tmp);
    }
    for (auto c : v) {
        cout << c->age << endl;
    }
}

执行输出:

Car():0
~Car():0
Car():1
~Car():1
Car():2
~Car():2
Car():3
~Car():3
Car():4
~Car():4
Car():5
~Car():5
Car():6
~Car():6
Car():7
~Car():7
Car():8
~Car():8
Car():9
~Car():9
9
9
9
9
9
9
9
9
9
9

在循环内部创建的 tmp 对象具有循环迭代内的局部作用域。当循环迭代结束时,tmp 对象会被销毁。可以明显看到析构函数被触发了。在vector中留下了指向已不再存在的对象的指针,当你尝试访问它们的属性时会导致未定义行为

程序应该改为

class Car {
public:
    int age;
    Car(int a) : age(a) { cout << "Car():" << age << endl; }
    ~Car() { cout << "~Car():" << age << endl; }
};

int main() {
    vector<unique_ptr<Car>> v;
    for (int i = 0; i < 10; i++) {
        v.push_back(make_unique<Car>(i)); // 使用智能指针
    }
    for (int i = 0; i < v.size(); i++) {
        cout << v[i].get()->age << endl;
    }
}

微信公众号

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据