智能指针探索(一)——成员变量的释放
来源:互联网 发布:初学者编程 编辑:程序博客网 时间: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 编辑器,无序列表格式全丢
阅读全文
0 0
- 智能指针探索(一)——成员变量的释放
- 智能指针的释放
- 智能指针的释放
- 智能指针——类指针成员的复制
- C++智能指针作为成员变量的用法
- 类的指针成员释放
- C++学习笔记(3)——成员变量、成员函数的指针
- C++智能指针(一)智能指针的简单介绍
- CComQIPtr CComPtr智能指针的释放
- C++释放类的静态指针成员
- 智能指针释放
- 智能指针释放失败
- C++学习(2)--成员变量、成员函数的指针
- 管理指针成员(智能指针)
- pcap学习总结(一)——网卡类型,获得指向网卡的指针,释放网卡
- 智能指针(一)
- 有效的使用和设计COM智能指针 ——条款13:必须提前释放COM组件时,别妄想智能指针帮你完成
- 探索智能指针
- Activity的用法
- Coursera加密与加密货币导论1-3、1-4数字签名
- 免安装版的mysql5.7的安装和配置(mysql-5.7.18-winx64.zip)
- DOM节点属性
- [CF480D]Parcels
- 智能指针探索(一)——成员变量的释放
- firefox历年版本的官方镜像地址 和 所有的geckodriver.exe驱动大全
- 23种设计模式
- python unittest用法
- HDOJ 1007 Quoit Design (最近点对+分治)
- Servlet异常处理
- java多线程开发基础
- thinkphp对数据库的删改查
- Spark RDD API详解