三种new
http://www.cnblogs.com/zhuyf87/archive/2013/03/23/2976714.html
第一种是正常的new,它是语言内建的,不能重载。
new operator完成以下三件工作:
1. allocate memory for this object.
2. call constructor to init that memory.
3. return the pointer of this object.
(2)operator new
operator new是普通操作符,和加减乘除操作符的地位一样,可以重载。
默认情况下,operator new尝试从堆上申请内存,如果成功则返回内存指针,如果失败会调用new_handler,然后继续重复前面过程,直到抛出异常(bad_alloc)为止。
operator new函数原型:void * operator new(size_t size);
operator new可以重载,可以为某个类单独重载,也可以全局重载(将改变所有operator new的行为方式)。如果重载了operator new,应该重载operator delete。
(3)placement new
(定位new)在已分配的原始内存中初始化一个对象。它与new的其他版本的不同之处在于,它不分配内存。相反,它接受指向已分配但未构造的内存的指针,并在该内存中初始化一个对象。placement new表达式能够在特定的、预分配的内存地址上构造一个对象。
placement new是c++标准库的一部分,使用时需包含<new>头文件。
void *s = operator new( sizeof(A) ); A *p = (A*)s; new(p) A(2013); // p->A::A(2013); // processing code… p->~A();
如果显示的调用placement new,也应该显示的调用与之对应的placement delete:p->~A();。这份工作本来应该由编译器自动完成:在使用new operator时,编译器会自动生成调用placement new的代码。所以,除非特别必要,不要直接使用placement new。只有当默认的new operator对内存的管理不能满足需要,希望自己手动管理内存时,才考虑使用placement new。就像STL中的allocator一样,它借助placement new来实现更灵活有效的内存管理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!