概述
文章目录
- new 与 malloc 的区别
- delete 与 free
- 三种 new
- 普通new
- nothrow new
- 定位new
- new 与 new[]
new 与 malloc 的区别
1、new 是运算符,malloc 时系统函数
2、new 先开辟内存,再调用构造对象的构造函数 malloc 只开辟内存
3、new 可以给开辟的内存进行初始化,malloc 不能初始化
4、new 开辟内存成功返回对象类型的指针,malloc 开辟成功返回void *类型的指针
5、new 开辟失败抛出异常,malloc 返回NULL
6、new 开辟内存给定对象的个数,malloc 需要给定内存块的大小
delete 与 free
1、delete 是运算符,free是库函数
2、delete 受类型的影响,强制类型转换后的(把一个对象转成int型)后delete 不会调用析构函数,free 不受类型的影响,
3、delete 先析构对象再释放内存,free直接释放内存
4、对数组的释放delete[]ptr free(ptr)
针对delete 与 free第二条的测试
class A
{
public:
A(){cout << "A()" << endl;}
~A(){cout << " ~A() " << endl;}
};
int main()
{
A *pa = new A;
//delete pa;
int *tmp = (int *)pa;
//这里delete之后不会调用析构函数
delete tmp;
return 0;
}
三种 new
普通new
普通new 的大致实现代码,内存申请失败会抛出异常,不能通过返回值是否为nullptr 来判断内存是否申请成功
void *operator new(size_t size)
{
cout << "new" << endl;
void *p = nullptr;
p = malloc(size);
if(p == nullptr)
{
throw bad_alloc();
}
return p;
}
nothrow new
不抛异常的new, 内存申请失败返回nullptr
void *operator new(size_t size)
{
cout << "new" << endl;
void *p = nullptr;
p = malloc(size);
if(p == nullptr)
{
throw bad_alloc();
}
return p;
}
定位new
定位new 会在你给定的位置开辟一块内存,这个操作是十分危险的,
int main()
{ /*
先申请一块内存,让 pa 指向了它
*/
int *pa = new int;
/*
在pa释放之前我们有申请了一次,重复申请,这里不会报错
*/
int *p = new(pa) int;
/*
申请完之后释放了pa
*/
delete pa;
/*
这时候再释放p 程序就会挂掉
*/
delete p;
return 0;
}
有时候我们可能会定位到一正在使用的内存块,不管是修改内存中的内容还是释放了该内存,都是我们不想要看到的。
new 与 new[]
class A
{
private:
int mdata;
};
int main()
{
int a = new A;
int b = new A[1];
/*
上面的 a 和 b 有什么区别?
*/
}
在这里插入图片描述
可以看出new []在开辟内存的时候会多开辟出4个字节记录对象的个数,在析构的时候可以明确地知道调用多少次析构函数,申请完内存都是返回给用户p处的地址。
如果调用delete 则只析构一次,从p处释放内存。
如果调用delete[] 则析构的次数有p前面的4个字节处,释放的时候p先向前移动4个字节然后再释放。
最后
以上就是畅快樱桃为你收集整理的new 与 mallocnew 与 malloc 的区别delete 与 free三种 newnew 与 new[]的全部内容,希望文章能够帮你解决new 与 mallocnew 与 malloc 的区别delete 与 free三种 newnew 与 new[]所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复