智能指针探索(一)——成员变量的释放

来源:互联网 发布:初学者编程 编辑:程序博客网 时间:2024/06/07 08:24

  • 测试代码
  • 测试结果
  • 测试结论


测试代码

#include <iostream>#include <vector>#include <memory>#include <algorithm>using namespace std;class Engine {public:  Engine() {    num = 8;  }  ~Engine() {    cout << __FUNCTION__ << endl;  }private:  int num;};class Car {public:  Car() {  }  Car(Engine* _engine) {    this->engine = _engine;  }  Car(shared_ptr<Engine> _engineSharedPtr) {    this->engineSharedPtr = _engineSharedPtr;  }  Car(vector<Engine*> _engines) {    this->engines = _engines;  }  Car(vector<shared_ptr<Engine>> _enginesSharedPtr) {    this->enginesSharedPtr = _enginesSharedPtr;  }  Engine* getEngine() {    return this->engine;  }  ~Car() {    cout << __FUNCTION__ << endl;  }private:  Engine* engine; // normal pointer  shared_ptr<Engine> engineSharedPtr; // shared_ptr  vector<Engine*> engines; // normal pointer in vector  vector<shared_ptr<Engine>> enginesSharedPtr; // shared_ptr in vector};int main(int argc, char const *argv[]) {  cout << "1.Use normal pointer as member variable:" << endl;  Engine* engine = nullptr;  {    shared_ptr<Car> car(new Car(new Engine()));    engine = car->getEngine();  }  if(engine) {    cout << "not nullptr" << endl;    delete engine;    engine = nullptr;  }  cout << "2.Use smart pointer as member variable:" << endl;  {    shared_ptr<Car> car(new Car(new Engine()));  }  cout << "3.Use normal pointer as vector's elements:" << endl;  {    vector<Engine*> engineVector;    engineVector.push_back(new Engine());    engineVector.push_back(new Engine());    engineVector.push_back(new Engine());    engineVector.push_back(new Engine());    shared_ptr<Car> car(new Car(engineVector));  }  cout << "4.Use smart pointer as vector's elements:" << endl;  {    vector<shared_ptr<Engine>> engineVector;    engineVector.push_back(shared_ptr<Engine>(new Engine()));    engineVector.push_back(shared_ptr<Engine>(new Engine()));    engineVector.push_back(shared_ptr<Engine>(new Engine()));    engineVector.push_back(shared_ptr<Engine>(new Engine()));    shared_ptr<Car> car(new Car(engineVector));  }  return 0;}

测试结果

这里写图片描述


测试结论

1、不使用智能指针当做成员变量,其生命周期可能不会随着宿主对象的生命周期结束而结束,除非在析构函数中显式调用delete
2、使用智能指针当做成员变量,其生命周期会随着宿主对象的生命周期结束而结束,可以不在析构函数中显式调用
3、不使用智能指针当做容器的成员变量,其生命周期可能不会随着宿主容器的生命周期结束而结束
4、使用智能指针当做容器的成员变量,其生命周期会随着宿主容器的生命周期结束而结束

当然这些仅仅是实验性的结论,如果懂得C++对象的内存分配机制的话,完全可以从理论上得出这些结论


CSDN 辣鸡 MD 编辑器,无序列表格式全丢

原创粉丝点击