1、计算机中的内存划分
2、c++中用 new 分配堆空间 delete 释放
2.1、分配一块堆空间
数据类型 *变量名 = new 数据类型; // -> 分配一块内存空间
例子:分配一块int 类型的堆空间
int *p = new int;//一条龙服务!!自己计算 空间的大小,自己进行 类型的转换!!
int *q = new int(10086); //支持在分配空间的时候对堆空间进行初始化!!
释放堆空间: delete 变量名
例子: delete p;
delete q;
2.2、分配多块堆空间
数据类型 *变量名 = new 数据类型[size]; // size用户需要分配多少块这样的堆空间
例子: 分配100 块int 类型的堆空间
int *p = new int[100];
例子: 分配多块堆空间并初始化,只初始化了前面5个
int *q = new int[20]{1,2,3,4,5};
释放多块堆空间: delete []变量名;
例子:delete []p;
例子:利用new 去分配一个二维数组
int main()
{
//该数组的类型是什么 ???
// int a[10][10];
int (*p)[10] = new int[10][10];
//对二维数组进行赋值 int x=0,y=0;
for(y=0;y<10;y++)
for(x=0;x<10;x++)
{
p[y][x] = x+y;
}
//输出
for(y=0;y<10;y++)
for(x=0;x<10;x++)
{
cout << p[y][x] << endl;
}
//释放
delete []p;
}
3、new 与 malloc 的区别
- new 可以自动计算数据类型的大小 与 类型的转换,malloc 只能手动进行。
- new 可以在分配空间的时候初始化,malloc 不行。
- (最重要的特点!!!)在分配类的堆空间时, 使用new会调用类中的构造函数,malloc 不行。
例子:class base { public: base(int a){ cout << "调用based的构造函数" << endl; this->a = a; } void show_base() { cout << a << endl; } private: int a; }; int main() { //利用malloc 分配base 的堆空间 //不会调用base 的构造函数的,导致类中的数据成员无法初始化 base *p = (base *)malloc(sizeof(base)); p->show_base(); //可以调用构造函数去初始化类中的成员 base *q = new base(10086); //提示:假设对象是一个指针 则用 -> q->show_base(); }