C++:1.2.2内存

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;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值