首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++中的new与delete小结

2013-10-13 
C++中的new与delete总结1. operator new、operator delete与new、delete操作符的区别:operator new的作用类

C++中的new与delete总结
1. operator new、operator delete与new、delete操作符的区别:operator new的作用类似于malloc,负责分配内存;operator delete的作用类似于free,负责释放内存new操作符包括两个步骤;调用适当的operator new版本分配内存;在分配的内存上调用构造函数delete操作符包括两个步骤:在内存上调用析构函数;调用适当的operator delete版本释放内存operator new和operator delete函数可以重载、重写(名字遮掩),而new/delete操作符不可2. 标准库提供的operator new/delete(C++11)标准库提供的global operator new,在全局名字空间中定义:

    void* operator new (std::size_t size); //全局标准版operator new    void operator delete(void* ptr);//全局标准版operator delete    class A{    public:        static void operator new(size_t size);//类专属标准版operator new        static void operator delete(void* ptr, size_t size) noexcept;//类特别成员版operator delete        static void operator delete(void* ptr) noexcept;//类专属operator delete    };
对应关系:
      标准版:void* operator new(std::size_t size)可与两种operator delete对应,即void operator delete(void* ptr)或void operator delete(void*ptr, size_t)。且无论在正常情况下,还是异常情况下,C++优先使用第一种operator delete非标准版:void* operator new(std::size_t size, ...)与void operator delete(void* ptr, ...)对应。未发生异常时,C++编译器调用operator new(标准版或非标准版依据new操作符是否传递额外参数而定)分配内存,调用标准版的operator delete(无论该内存是否通过标准版的operator new)释放内存。异常发生时(operator new成功调用,但调用对象构造函数时发生异常),编译器会调用与operator new参数对应的operator delete版本,若未找到,则不会调用其他形式的operator delete
operator new与new handler。编写自定义的operator new,在发生异常或内存不足时,应正确调用已设置的new handler4. 自定义operator new与operator delete可以重新定义标准库提供的非placement版本的operator new和operator delete建议在global和class作用域中重写或重载自定义的operator new和operator delete5. operator new/delete与类层次类的operator new成员通常仅负责当前类的内存分配,并不负责子类的内存非配类的析构函数应该是virtual的,否则Base *pb = new Derived; delete pb;将不能传递正确的size_t参数给子类的operator delete成员6. operator new/delete与operator new[]/delete[]以上规则均适用于operator new[], operator delete[],仅仅是函数名字不同参考:
http://www.cplusplus.com/reference/new/operator%20new/
operator new在C++中的各种写法 http://blog.sina.com.cn/s/blog_3c6889fe0100tqe8.html
c++重载operator new和operator delete http://blog.csdn.net/bichenggui/article/details/4553728
C++中的new和delete http://www.cnblogs.com/fly1988happy/archive/2012/04/26/2471099.html
033_深入C++的new http://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/17/2728019.html

热点排行