目录
在程序运行过程,为了能自由控制内存的声明周期、大小,会经常使用堆空间的内存
堆空间的申请\释放
- 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));