1、C++中的 new 与 delete

1、new/delete 和 malloc/free 之间有什么关系?

1、new 分配内存按照数据类型进行分配,无需指定空间的大小,编译器会自行计算;malloc 分配内存按照指定的大小分配,需要显式的计算;
2、new/delete 返回的是指定对象的指针,而 malloc/free 返回的是 void类型的指针,因此 malloc 的返回值一般都需要进行类型转化。
3、new的底层通常使用malloc,然后调用构造函数,最后返回自定义类型的指针。delete先调用析构函数,底层通常是free。
4、new 是一个操作符可以重载,malloc 是一个库函数。new一般分为两步:new操作和构造。new操作对应与malloc,但new操作可以重载,可以自定义内存分配策略,不做内存分配,甚至分配到非内存设备上,而malloc不⾏。
5、malloc 分配的内存不够的时候,可以用 realloc 扩容。扩容的原理?new 没用这样操作。
6、new 如果分配失败了会抛出 bad_alloc 的异常,而 malloc 失败了会返回 NULL。
7、申请数组时: new[]一次分配所有内存,多次调用构造函数,搭配使用 delete[],delete[]
多次调用析构函数,销毁数组中的每个对象。而 malloc 则只能 sizeof(int) * n。

8、new[]和delete[]必须成对使用,否则的话new[]和delete只会释放掉第一个元素造成内存泄漏。

9、malloc/free需要库文件stdlib.h的支持,new/delete则不需要!

注意:

        delete和free被调用后,内存不会立即回收,指针也不会指向空,delete或free仅仅是告诉操作系统,这⼀块内存被释放了,可以用作其他用途。但是由于没有重新对这块内存进行写操作,所以内存中的变量数值并没有发⽣生变化,出现野指针的情况。因此,释放完内存后,应该将该指针指向NULL。

        还要谨防重复释放内存,也会有危险,在浅拷贝时会遇到重复释放,应该使用深拷贝,即再开辟一块内存,指针指向另一块内存。

        要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问。

2、delete 与 delete[] 有什么区别?

1、对于简单类型来说,使用 new 分配后,不管是数组还是非数组形式,两种⽅方式都可以释放内存:

int *a = new int(1);
delete a;
int *b = new int(2);
delete [] b;
int *c = new int[11];
delete c;
int *d = new int[12];
delete [] d;

2、对于⾃自定义类型来说,就需要对于单个对象使⽤ delete ,对于对象数组使⽤ delete [] ,逐个调⽤用数组中对象的析构函数,从⽽释放所有内存;
如果反过来使用,即对于单个对象使用 delete [] ,对于对象数组使用 delete ,其行为是未定的;
3、所以,最恰当的方式就是如果用了 new ,就用 delete ;如果用了 new [] ,就⽤ delete [] 。

3、内存块太小导致malloc和new返回空指针,该怎么处理?

1、对于 malloc 来说,需要判断其是否返回空指针,如果是则马上⽤用return 语句终止该函数或者 exit 终止该程序;

2、对于new来说,确认抛出异常,所以可以使用try...catch...代码块的方式:

try {
    int *ptr = new int[10000000];
} catch(bad_alloc &memExp) {
    cerr << memExp.what() << endl;
}  

还可以使用set_new_handler函数的方式:

void no_more_memory() {
    cerr << "Unable to satisfy request for memory" << endl;
    abort();
}
int main() {
    set_new_handler(no_more_memory);
    int *ptr = new int[10000000];
}

在这种方式里,如果 new 不能满足内存分配请求, no_more_memory 会被反复调用,所以new_handler 函数必须完成以下事情:
★让更多内存可被使用:可以在程序⼀开始执行就分配⼀⼤块内存,之后当 new_handler 第⼀次被调⽤,就将这些内存释放还给程序使用;
★使⽤另⼀个 new_handler ;
★卸除 new_handler :返回空指针,这样 new 就会抛出异常;
★直接抛出 bad_alloc 异常;
★调用 abort 或 exit 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值