当前位置: 首页 > news >正文

c++创建函数对象的不同方式

 在C++中,创建任何一个对象(即使我们创建的是一个没有任何成员变量的对象)时,需要占用一定的内存空间。

        应用程序会将可用的内存(排除源代码运行的内存等)分出两个部分:栈(stack)和堆(heap)。所以——在C++中创建对象有两种方式:在栈上创建对象和在堆上创建对象。

        在栈上创建的对象,有一个自动的生命周期,他们的生命周期由它声明的作用域所决定,换言之,只要变量超出了其作用域,该对象的内存就被释放了。

        在堆上创建对象则不同。在堆上创建的对象会一直待在那里,直到你决定把它释放,空闲出其对应的内存。( 用delete进行释放)

person类:

#include<iostream>
#include<string>
using String = std::string;class Person
{
private:String m_Name;
public:Person() :m_Name("Unknown") {}Person(const String& name) :m_Name(name) {}const String& GetName() const { return m_Name; }
};

在栈上创建对象personOnStack。

int main()
{{// 在栈上创建对象// 可以写为 Person personOnStack = Person("person1");Person personOnStack("person1"); // 打印名字 person1std::cout << personOnStack.GetName() << std::endl;} // 当代码运行到此行时,personOnStack将被回收

在堆上创建对象personOnHeap。​​​​​​

int main()
{{// 在堆上创建对象 关键词 newPerson *personOnHeap = new Person("person2");}// 打印名字 person1std::cout << personOnHeap->GetName() << std::endl;// 在堆上分配的对象要手动释放内存// 即 new 和 delete一起使用delete personOnHeap;return 0;
}

进阶版

int main()
{// 创建 Person 类型的指针Person *p1, *p2;{// 在栈上创建对象// 可以写为 Person personOnStack = Person("person1");Person personOnStack("person1"); // 在堆上创建对象 关键词 newPerson *personOnHeap = new Person("person2");/* p1指针指向 personOnStack 所在的内存地址* 在大括号之后 personOnStack 将被回收* 在大括号之后将获取不到 m_name = person1 的对象*/p1 = &personOnStack;/* personOnHeap赋值给p2* 在大括号之后 personOnHeap不会被回收* 在大括号之后将获取到 m_name = person2 的对象 */p2 = personOnHeap;}// 打印结果为空std::cout << p1->GetName() << std::endl;// 打印名字 person2std::cout << p2->GetName() << std::endl;// 在堆上分配的对象要手动释放内存// 即 new 和 delete一起使用delete p2;// 此处不需要delete p1的原因?return 0;
}

 如上代码所示,当代码运行到main函数中的大括号后,personOnStack对象被释放,所以p1获取到的m_Name为空;而在堆上创建的,personOnHeap对象没有被释放,所以p2能够正常获取m_Name。

        最后,p1不需要delete的原因——main函数中的大括号之后,personOnStack对象被释放,所以personOnStack对象的地址也被释放,p1指针不需要被delete。
 

http://www.lryc.cn/news/217833.html

相关文章:

  • python实现从字符串中识别出省市区信息
  • GCN火车票识别项目 P1 火车票识别项目介绍 Pytorch LSTM/GCN
  • shell script 的默认变量$0,$1,$2...,参数偏移的shift
  • 2023年【危险化学品经营单位安全管理人员】复审考试及危险化学品经营单位安全管理人员模拟考试题库
  • Java 正则表达式重复匹配篇
  • 0009Java安卓程序设计-ssm基于android手机设计并实现在线点单系统APP
  • react_14
  • 批量导出 PPT的备注到一个txt文本中
  • 文本内容转换成语音播放的工具:Speech Mac
  • 运维知识点-MySQL从小白到入土
  • 【蓝桥杯基础题】门牌制作
  • MyBatis底层原理(小白版本)
  • 水经微图Web版从入门到精通
  • IntelliJ IDEA 2023 最新版如何试用?IntelliJ IDEA 2023最新版试用方法及验证ja-netfilter配置成功提示
  • LeetCode541. Reverse String II
  • ios原生分享
  • 【Ubuntu】安装chrome之后无法启动
  • 顺序栈练习
  • 安全与HTTP协议:为何明文传输数据成为争议焦点?
  • 【笔记】excel怎么把汉字转换成拼音
  • opencv官网文档学习
  • Android性能优化--Perfetto用SQL性能分析
  • NLP之Bert实现文本分类
  • Pytorch从零开始实战08
  • docker部署Jenkins(Jenkins+Gitlab+Maven实现CI/CD)
  • mapbox使用marker创建html点位信息
  • 项目构建工具maven的基本配置
  • 超详细docker学习笔记
  • Adobe acrobat 11.0版本 pdf阅读器修改背景颜色方法
  • HCIA数据通信——路由协议