malloc/free和new/delete区别
new = malloc + 构造函数
有先后
(理解:new在malloc开辟内存的基础上还自己构造[初始化]了相应的值存入该内存)
delete = 析构函数 + free
有先后
//malloc:找块地
//new:找块地+建个房
//free:回收地
//delete:把房子拆了+回收地
具体描述:
(1) new
是关键字/操作符,而malloc
是函数。
(2) new
一个对象的时候,不但分配内存,而且还会调用类的构造函数当然如果类没有构造函数,系统也没有给类生成构造函数,那没法调用构造函数了)。
(3)在某些情况下,A * ptr = new A();
可以把对象的某些成员变量(如m_A
)设置为0,这是new
的能力之一,malloc
没这个能力。
同理,delete
与free
的区别也就比较明显:delete
不但释放内存,而且在释放内存之前会调用类的析构函数(当然必须要类的析构函数存在)。
- (1) malloc
malloc向堆区申请一块内存,随机给内存中赋值。
如下:向内存申请10个int大小的空间(40字节),将10个空间里随机赋值,并将指针p指向首地址。
int *p = (int *)malloc(10*sizeof(int));
- (2) new
new不仅会申请内存(malloc),还会调用构造函数。
new分为系统自带类型和自定义类型
1)系统自带类型(整型为例):
int main() {
//不带()
int *ptr = new int;
//带()
int *ptr2 = new int();
//()里带值
int *ptr3 = new int(10);
return 0;
}
结果: 不带()
,ptr指向内存随机赋值;带()
,ptr2指向内存赋值为0;()
里带值,ptr3指向内存赋值为对应数据。
2)自定义类型:
第一种情况:
class A {//不自己写构造函数
public:
int m_A;
};
int main() {
//不带()
A* ptr = new A;
//带()
A* ptr2 = new A();
return 0;
}
结果: 不带()
,m_A
随机初始化构造;带()
,m_A
初始化构造为0。
第二种情况:
class A {//自己写构造函数,不初始化
public:
int m_A;
A() {}
};
int main() {
//不带()
A* ptr = new A;
//带()
A* ptr2 = new A();
return 0;
}
结果: 不管带不带()
,m_A
随机初始化构造。