new 和 malloc 之间的区别和联系 今天写作业的时候要求实现vector,很自然地用 ,但是告知不能使用,没有办法就只能使用了。于是忽然想到、都是在上开辟动态空间,那么有什么异同呢? malloc() malloc只负责开辟一个指定大小的空间,类似的则使得在开辟空间的同时初始化为0。 malloc的特点在于将内存空间视为链表,在内存上找到足够长的初始空间返回给目标空间的开头地址,如果失败就会返回(因此使用malloc必须要检验返回指针)。 由于malloc开辟的空间在上,这就使得可以在函数内定义的变量在函数被销毁会变量不会被同步销毁。因此释放heap的空间只能通过手动。 在开辟新空间时往往会多开辟一些空间用于存储空间长度,前后空间指针的信息,由源码可见,实际上free是将上的可用空间定义为指针传入的指针位置减去malloc所要求的大小–所以free本质上是定义了一个指针告诉OS:一个指针到另一个指针之间的空间是可用的。由此函数对传入的指针要求非常严格,必须是malloc空间的起始指针。 new() intuitive的区别: 首先有个好处可以简单地进行初始化,即使用new时会调用该类型的默认构造函数。并且开辟的空间需要用函数删除。 更重要的区别是: 函数调用的空间在C++被抽象为(反向定义–new的空间才被视为free store,由OS特别管理)上。一般都是在heap上,但是取决于自身的实现,也可以在区域。 有多种变体,如定位new–直接使用传入的地址而不考虑是否该地址为空可以使用 函数返回的指针类型与开辟空间的数据类型相符合,这就意味着不需要像malloc一样在cast后才能使用,在数据上更加安全。 如果分配失败,不会返回错误会直接丢出异常,如果想要确认需要使用catch summary: 特征new/deletemalloc/free分配内存的位置自由存储区堆内存分配成功返回值完整类型指针void*内存分配失败返回值默认抛出异常return NULL分配内存的大小由编译器根据类型计算得出必须显式指定字节数处理数组有处理数组的new版本new[]需要用户计算数组的大小后进行内存分配已分配内存的扩充无法显式处理realloc是否相互调用可以,operator new/delete即由此实现不可调用new分配内存时内存不足客户能够指定处理函数或重新制定分配器无法通过用户代码进行处理函数重载允许不允许构造函数与析构函数调用不调用
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/66045.html