文章目录
- new 和 delete的用法
- operate new() operate delete()
- new delete 和 malloc free的区别
- new[] delete[] 的含义
new 和 delete的用法
基本写法,new也是先申请空间
这里的new和malloc用的地方一样但是new用起来代码简洁不少而且不需要强转和指定大小
int main()
{
int* p = new int;
int* p2 = (int*)malloc(sizeof(int));
delete p;
free(p2);
return 0;
}
但是new真正要解决的问题不在这种地方
我们来写一个类看看new在类中的发挥
class A
{
public:
A(int c)
{
_a = c;
}
private:
int _a;
};
int main()
{
//我们申请了一块儿大小为A字节的空间但是麻烦的来了我们该如何初始化呢???
A* ptr = (A*)malloc(sizeof(A));
free(ptr);
//ptr->A????
//我们都知道构造函数是不可以被显式的调用(这里的处理方式我们后面可以学习定位new但是现在不予考虑)
return 0;
}
所以new处理的的第一个问题就是malooc无法初始化自定义类型的问题,但是new我们可以直接初始化也就是去调用其构造函数
class A
{
public:
A(int c)
{
_a = c;
}
private:
int _a;
};
int main()
{
//它会去调用该类的构造函数进行初始化
A* ptr = new A;
delete prt;
//这里的delete就会自动调用该类的析构函数 然后再释放空间
return 0;
}
那么如果我们想给new出来的空间赋值或者开辟指定大小的空间呢??
给自定义类型进行赋值也就是调用自定义类型的构造函数进行传参等操作
对待内置类型进行初始化赋值也是直接进行小括号内部赋值
如何一次性开辟多个对象的空间呢?
对于内置类型我们认为
对于我们的自定义类型
operate new() operate delete()
ok知道了new 的基本用法我们来了解一下new的实现过程
new 和 delete 是两个操作符使用它们的时候会去调用两个全局函数一个是operate new() 一个是operate delete()这两个全局函数我们可以来看一看
通过汇编指令我们可以看见operate new[] 因为我们这里new 了多个对象所以调用的函数也是 operate new[] 但是它也没啥特别的
当我们进入到operate new[] 函数里面的时候我们就可以发现
所以重头戏是operate new ,它里面的实现过程是什么样的呢?
我们发现new 的实现就是通过malloc实现的,那么delete任然同理 delete就是通过free()来实现
new delete 和 malloc free的区别
他们一共有六点不同
1.new 和 delete 是操作符,malloc() 和 free() 是函数
2.new 和 delete 不需要自己手动算大小[X]即可 但是 malloc 需要自己算大小
3.new 可以对自定义类型进行主动初始化 malloc() 做不到
4.new 可以自动写明类型也就是跟的空间类型 malloc需要强制转换因为malloc的返回值是void*
5.new 如果申请空间失败了是捕获异常,malloc()则是返回NULL
6.new 会去调用 自定义类型的构造函数 malloc 不能,malloc只能申请空间
new[] delete[] 的含义
为什么我们delete的时候只需要写delete[]不需要给这个括号里写入大小呢??
这一切都是编译器帮我们做的
所以当我们new[] 完成的时候 我们delete[] 这个方括号不能掉了不然编译器识别不到,就会少释放四个字节的空间,那么就会造成内存的泄露这个危害我们以后也会讲