堆空间
◼ 在程序运行过程,为了能够自由控制内存的生命周期、大小,会经常使用堆空间的内存
◼ 堆空间的申请\释放
malloc \ free
new \ delete
new [] \ delete []
◼注意
申请堆空间成功后,会返回那一段内存空间的地址
申请和释放必须是1对1的关系,不然可能会存在内存泄露
◼ 现在的很多高级编程语言不需要开发人员去管理内存(比如Java),屏蔽了很多内存细节,利弊同时存在
利:提高开发效率,避免内存使用不当或泄露
弊:不利于开发人员了解本质,永远停留在API调用和表层语法糖,对性能优化无从下手
堆空间的初始化
memset
◼ memset函数是将较大的数据结构(比如对象、数组等)内存清零的比较快的方法
对象的内存
◼ 对象的内存可以存在于3种地方
全局区(数据段):全局变量
栈空间:函数里面的局部变量
堆空间:动态申请内存(malloc、new等)
构造函数(Constructor)
◼ 构造函数(也叫构造器),在对象创建的时候自动调用,一般用于完成对象的初始化工作
◼特点
函数名与类同名,无返回值(void都不能写),可以有参数,可以重载,可以有多个构造函数
一旦自定义了构造函数,必须用其中一个自定义的构造函数来初始化对象
◼注意
通过malloc分配的对象不会调用构造函数
◼ 一个广为流传的、很多教程\书籍都推崇的错误结论:
默认情况下,编译器会为每一个类生成空的无参的构造函数
正确理解:在某些特定的情况下,编译器才会为类生成空的无参的构造函数 ✓ (哪些特定的情况?以后再提)
构造函数的调用
默认情况下,成员变量的初始化
◼ 如果自定义了构造函数,除了全局区,其他内存空间的成员变量默认都不会被初始化,需要开发人员手动初始化
成员变量的初始化
◼ 对象初始化