C++导致悬垂指针的一个场景
版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | 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;
}
}