扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
1.申请的内存所在的位置 new操作符从自由存储区上为对象动态分配内存空间,malloc从堆上动态分配内存。 自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行进行内存申请,该内存即为自由存储区。而堆是操作系统所维护的一块特殊内存,用于程序的动态分配。C语言使用malloc从堆上分配内存,使用free释放已分配的内存。 而自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。 2.返回类型的安全性 new 内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,所以new是符合类型安全性的操作符。 malloc 内存分配成功则是返回void*,需要通过强制类型转换将void*指针转换成我们需要的类型。 3.内存分配失败时的返回值 new内存分配失败时,回抛出bac_alloc异常,不会返回NULL,malloc内存分配失败时,会返回NULL. 4.是否需要指定内存大小 使用new操作符申请内存分配时无需指定内存块的大小,编译器会根据类型信息进行自动计算,而malloc则需要显式的指出所需内存的大小。 5.是否调用构造函数和析构函数 使用new操作符来分配对象内存时会经历三个步骤: (1)调用operator new 函数(数组operator new [])分配一块足够大的,原始的未命名的内存空间以便存储特定类型的对象。 (2)编译器调用构造函数进行初始化; (3)对象构造完成后,返回一个指向该对象的指针。 使用delete操作符来释放对象内存时会经历两个步骤: (1)调用对象的析构函数 (2)编译器调用operator delete(或operator delete[])函数释放空间。 6.对数组的处理 C++提供了new[]与delete[]来专门处理数组类型。 new对数组的支持体现在它会分别调用构造函数初始化数组的每一个元素,释放对象时为每个元素调用析构函数。 至于malloc,它并不知道你在这块内存上刚的是数组还是其它东西。反正就是给你一块原始的内存,再给一个内存的地址就完事了。 7.new与malloc是否可以互相调用 operator new/operator delete的实现基于malloc和free,而malloc和free的实现不可以调用new和delete。 8.是否可以被重载 operator new和operator delete可以被重载,malloc和free不可以被重载。 9.能否直观的重新分配内存 使用malloc分配的内存后,如果在使用过程中发现内存不足,可以使用realloc函数进行内存重新分配,实现内存扩充。new没有这样的配套设施来扩充内存。 10.客户处理内存分配不足 在operator new 抛出异常以反映一个未获得满足的需求之前,它会先调用一个用户指定的错误处理函数new-handler, 对于malloc,客户并不能够去编程决定内存不足以分配时要干什么事情,只能看着malloc返回NULL.为河西等地区用户提供了全套网页设计制作服务,及河西网站建设行业解决方案。主营业务为成都做网站、成都网站建设、河西网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流