1-1封装
成员变量私有化,提供公共的getter(方法)和setter(设值函数)给外界去访问成员变量
struct Person{
private:
int m_age;
public:
void setAge(int age)
{
this->m_age = age;
}
int getAge()
{
return this->m_age;
}
};
int main(void)
{
Person person;
person.setAge(20);
cout<<person.getAge()<<endl;
}
1-2内存布局
每个应用都有自己独立的内存空间,其内存空间一般都有以下几大区域口
代码段(代码区)
- 用于存放代码
数据段(全局区)
- 用于存放全局变量等
栈空间
-
每调用一个函数就会给它分配一段连 续的栈空间,等函数调用完毕后会自动回收这段栈空间
-
自动分配和回收
堆空间
-
需要主动去申请和释放
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hWCWpGAm-1623075736221)(D:\博客资料\C++\内存\1.png)]
1-3堆空间
■ 在程序运行过程,为了能够自由控制内存的生命周期、大小,会经常使用堆空间的内存
■ 堆空间的申请\释放
- malloc \ free
- new \ delete
- new [ ] \ delete [ ]
■ 注意
-
申请堆空间成功后,会返回那一段内存空间的地址
-
申请和释放必须是1对1的关系,不然可能会存在内存泄露
■ 现在的很多高级编程语言不需要开发人员去管理内存(比如Java),屏蔽了很多内存细节,利弊同时存在
- 利: 提高开发效率,避免内存使用不当或泄露
- 弊: 不利于开发人员了解本质,永远停留在API调用和表层语法糖,对性能优化无从下手
1>malloc、free
void test()
{
int *p1 = (int *)malloc(4); //指向开辟空间的前4个字节(int)
char *p2 = (char *)malloc(4); //指向开辟空间的第一个字节(char)
//以下两种方法完全等价
p[0] = 10;
p[1] = 20;
p[2] = 30;
p[3] = 40;
/*
*p = 10;
*(p + 2) = 20;
*(p + 3) = 30;
*(p + 4) = 40;
*/
free(p);
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VisFbt5o-1623075736223)(D:\博客资料\C++\内存\2.png)]
指针占4个字节,在64bit指针占8个字节
2>new、delete
void test()
{
new *p1 = new int;
*p1 = 10;
delete p1;
new *p2 = new char;
*p2 = 10;
delete p2;
char *p = new char[4];
delete[] p; //需要添加"[]",否则会出现错误
}
3>堆空间初始化
void test()
{
int size = sizeof(int) * 10;
int *p = (int*) malloc(size);
//memory set
memset(p,1,40);
//从p地址开始的连续4个字节中的每一个字节都设置为1
memset(p, 1,4);
//00000001 00000001 00000001 00000001
}
int *p1 = (int *)malloc(sizeof(int));// *p1未初始化
int *p2 = (int *)malloc(sizeof(int));
memset(p2, 0, sizeof(int)); //将*p2的每一个字节都初始化为0
int *p1 = new int; //未被初始化
int *p2 = new int(); //被初始化为0
int *p3 = new int(5); //被初始化为5
int *p4 = new int[3]; //数组元素未被初始化
int *p5 = new int[3](); //3个数组元素都被初始化为0
int *p6 = new int[3]{}; //3个数组元素都被初始化为0
int *p7 = new int[3]{ 5 }; //数组首元素被初始化为5,其他元素被初始化为0
4>memset
memset函数是将较大的数据结构(比如对象、数组等)内存清零的比较快的方法
Person person;
person.m_id = 1;
person.m_age = 20;
person.m_height = 180;
memset(&person,0, sizeof(person));
Person persons[] = { { 1,20,180 }, { 2,25,165,},{ 3,27,170 }};
memset(persons, 0, sizeof(persons));
1-4对象的内存
■ 对象的内存可以存在于3种地方
-
全局区((数据段):全局变量
-
栈空间:函数里面的局部变量
-
堆空间:动态申请内存(malloc、new等)
//全局区 Person g_person; int main() { // 栈空间 Person person; // 堆空间 Person *p = new Person; return 0; }