首页 > 编程知识 正文

swoole面试题,程序员思维逻辑面试题

时间:2023-05-03 17:11:19 阅读:146403 作者:3355

Day-15问题新闻和malloc有什么区别?

回答参考:

new与malloc的10个差异详细说明malloc与new的差异【c】new与malloc的差异经典问题new与malloc的差异C new-handler机制c中的delete与delete[]的差异new与malloc

1. new调用对象的构造函数来完成对象的结构; 不能做malloc。 这也是两者最大的区别classa{public:a(inta=1) :_a(a ) { cout'call A:A ) endl; } private: int _a; (; 输入主(语音) { cout'construct ap1: A* ap1=new A (; cout'construct ap2: '; *AP2=(a* ) malloc ) sizeof ); 返回0; (/*输出: construct AP 1: calla : a ) construct ap2:*/) /从这个例子中,malloc可以非常直观地看到不调用对象的构造函数。

2. new分配内存按数据类型分配,并返回指向指定对象的指针; malloc分配内存按指定大小分配,返回void*指针3. new操作符,从自由内存区域为对象分配内存空间,在delete中释放; malloc将内存区域从堆分配给对象,使用free释放自由内存区域是基于c的new算子的抽象概念,new申请的内存都被称为自由内存区域。

堆是操作系统级别的概念,是操作系统维护的特殊内存,用于程序的动态内存分配。

自由内存空间可以是堆,也可以不是。 这取决于具体的实现。 (默认情况下,c编译器使用堆实现自由存储。)

4 .内存分配失败时处理策略不同的: new操作符在内存分配失败时抛出bad_alloc异常,不返回NULL; 如果malloc在内存分配失败时返回NULL new和malloc,则如果系统内存不足或超出进程的内存配额,则内存分配将失败。

如果内存分配失败,new操作符将抛出异常,并通过捕获异常来确定内存分配是否成功。 new操作符在抛出异常之前调用用户指定的错误处理函数。 这称为新处理程序处理机制。 具体请参阅了解C new-handler机制。

如果内存分配失败,malloc返回NULL,并通过比较返回值是否为NULL来确定内存分配是否成功。

如何捕获malloc内存分配失败int*P1=(int* ) malloc ) sizeof(int ); if(p1==null ) { cout )内存分配失败(endl; 退出(1; (如何捕获//new内存分配失败try(int*p2=newint ); }catch(bad_alloc ) { cout )内存分配失败(endl; 退出(1; } 5.使用数组申请时操作不同的:new[]一次分配所有内存,多次调用构造函数。 另一方面,请注意,malloc在malloc(sizeof ) obj (n )中分配所有内存,因此new ) )必须与delete[] )配合使用以防止内存泄漏。

如果使用new[]分配数组,则对于:基本数据类型,可以使用delete[]或delete; 但是,对于自定义数据类型,必须使用delete[]。 如果不使用,将发生内存泄漏。

classa{public:a(inta=1) :_a(a ) a ) { cout'call A:A () ' endl; ((a ) ) cout'calla: ) ) ) ) ) endl; } private: int _a; (; intmain(void ) { A* ap3=new A[5]; cout'delete ap3:'endl; delete []ap3; //A* ap4=new A[5]; //cout'delete ap4:'endl; //delete ap4; //错误报告int* p3=new int[5]; cout'delete p3:'endl; delete []p3; int* p4=new int[5]; cout'delete p4:'endl; delete p4; //关于基本类型可以,但不推荐返回0; }/* 输出:call A:A(call A:A ) call a : a (calla: a ) calla : a (delete AP : calla 3360 (a ) calla : ) calla ) a:~a )如果deletep : deletep 4: */6.malloc分配的内存不足,可以使用realloc扩展容量; new没有这样的辅助设施。 以下内容详细说明了new和malloc点的区别

使用malloc分配的内存后,如果在使用过程中发现内存不足,可以使用realloc函数重新分配内存以实现内存扩展。 realloc首先判断当前指针指向的存储器中是否有足够的连续区域,如果有,则立即扩大可分配的存储器地址,如果返回原地址指针的区域不够,则按照新指定的大小分配区域,最初还是分配原始数据

7. new操作员可以重载: malloc是库函数,不能重载c标准库。 定义了8个重载版本: operator new和operator delete。 前四个版本可能抛出bad_alloc异常,而后四个版本不会抛出异常。

//这些版本可能会抛出异常的void *操作器新(size _ t )。 //指定对象void *操作器new [ ]; //数组分配void *操作删除(void * )否执行;//一个对象void *操作删除[ (void * ) noexcept; //释放数组//这些版本是异常的void *操作者new (size _ t,nothrow_t ) noexcept; void *操作器new [ (size _ t,nothrow_t ) noexcept; void *操作器删除(void *,nothrow_t ) noexcept; void *操作器delete [ (void *,nothrow_t ) noexcept; 不能使用construct函数为operator new分配的内存空间构建对象。 相反,必须使用新的定位新(placement new )格式构建对象。

:新/删除功能完全覆盖了malloc/free,为什么需要malloc和free? new/delete是c运算符,malloc/free是c /c支持的库函数。

malloc/free只负责申请和释放内存,但c要求许多自定义类在创建时自动运行构造函数,在销毁时自动运行析构函数。 使用new/delete运算符可以满足这种需要。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。