学习笔记:堆空间

目录

堆空间的申请\释放

初始化:memset


​​​​​​​

在程序运行过程,为了能自由控制内存的声明周期、大小,会经常使用堆空间的内存

堆空间的申请\释放

  • malloc \ free
  • new \ delete
  • new[] \delete[]
int *p = (int *) malloc(4);
* p = 10;

 下图是上面两行在X86环境的内存空间分布

 demo:

#include <iostream>
#include <cstring>
using namespace std;
void test(){
    int *p = (int *) malloc(4);
    cout << "-1-:" <<*p <<endl;
    * p = 10;
    cout << "-2-:" <<*p <<endl;
    free(p);

    char *p1 = (char *) malloc(4);
    p[0]=10;
    p[1]=11;
    p[2]=12;
    p[3]=13;
    *p1 = 10;
    *(p1+1)=11;
    *(p1+2)=12;
    *(p1+3)=13;
    free(p1);

    int size = sizeof(int)*10;
    int *p2 = (int *) malloc(size);
    memset(p2,0,size);
    cout << "-3-:" <<*p2 <<endl;
    free(p2);
    // 从p地址开始的连续4个字节中的每一个字节都设置为1
    //memset(p,1,4);
    //将4个字节设置为1
    // 00000000 00000000 00000000 00000001
    // 将4个字节中的每个字节设置为1
    // 00000001 00000001 00000001 00000001
}

void test2(){
    int *p = new int;
    *p = 10;
    delete p;
    char *p1 = new char;
    *p1 = 10;
    delete p1;

    char *p2 = new char[4];
    p2[0] = 10;
    delete[] p2;
}

void test3(){
    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
    cout << " * p1:" <<*p1 <<endl;
    cout << " * p2:" <<*p2 <<endl;
    cout << " * p3:" <<*p3 <<endl;
    cout << " * p4:" <<*p4 <<endl;
    cout << " * p5:" <<*p5 <<endl;
    cout << " * p6:" <<*p6 <<endl;
    cout << " * p7:" <<*p7 <<endl;

}
int main(){
    test();
    test2();
    test3();
    return 0;
}
//结果
-1-:-1163005939
-2-:10
-3-:0
 * p1:-1163005939
 * p2:0
 * p3:5
 * p4:-1163005939
 * p5:0
 * p6:0
 * p7:5

初始化: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},{1,20,180},{1,20,180}};
memset(persons,0,sizeof(persons));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值