`
kmplayer
  • 浏览: 496999 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

条款8:撰写operator new和operator delete时应遵行的公约

阅读更多
1,写自己的operator new时,函数的行为与缺省的new保持一致性.
(1)内存不足时,会调用一个new-handler.
(2)应对new(0)的情况.
(3)避免遮盖"正常"形式的new.

2,C++标准要求:即使用户要求一个0 bytes内存,operator new也应该传回一个合法指针.
注:每个class都有非零大小.
#include <iostream>
using namespace std ;
class X
{
};

int main ()
{
    cout<<sizeof(X)<<endl; //输出1
	  return 0 ; 
}


3,如果配置不成功,operator new会一再尝试配置内存,调用错误处理函数.
只有当错误处理函数的指针是null时,operator new才会抛出一个exception.
一个默认operator new的伪代码:
void* operator new(size_t size)
{
    if(size==0)
        size=1;
    while(true)  //死循环
    {
        attempt to allocate size memory;
        if(successful)
            return(a pointer to the memory);

        //不成功,调用错误处理函数  抛出异常或abort()跳出循环

        //得到错误处理函数
        new_handler globalHander =set_new_handler(0);
        set_new_handler(globalHander);

        if(globalHander)
            (*globalHander)();
        else
            throw std::bad_alloc();
    }
}


4,
non-member operator delete的伪码:
void operator delete(void* rawMemory)
{
    if(rawMemory==0) return;//删除NULL指针,什么也不做.
    Deallocate the memory pointed to by rawMemory.
    return;
}


member operator delete的伪码:
void Base::operator delete(void* rawMemory,size_t size)
{
    if(rawMemory==0) return;//删除NULL指针,什么也不做.
    if(size!=sizeof(Base))
    {
        ::operator delete(rawMemory); //令标准版delete处理
        return;
    }
    Deallocate the memory pointed to by rawMemory.
    return;
}
分享到:
评论

相关推荐

    Effective.C++.中文第二版.50条款doc文档.chm

    条款8: 写operator new和operator delete时要遵循常规 条款9: 避免隐藏标准形式的new 条款10: 如果写了operator new就要同时写operator delete 第三章 构造函数,析构函数和赋值操作符 条款11: 为需要动态分配内存的...

    new操作符(new operator)和operator new的区别

    new操作符(new operator)和operator new的区别,会很有帮助

    Effective C++

    条款8:写OPERATOR NEW与OPERATOR DELETE要遵循常规 条款9:避免隐藏标准形式的NEW 条款10:如果写了OPERATOR NEW就要同时写OPERATOR DELETE 条款11:为需要动态分配内存的类声明一个拷贝构造函数和一个赋值函数 条款12:...

    006_OSQP: An Operator Splitting Solver forQuadratic Programs

    006_OSQP: An Operator Splitting Solver forQuadratic Programs osqp原理推到及实现文档

    cpp代码-只能创建栈对象 做法:将operator new/delete设置为私有的

    cpp代码-只能创建栈对象 做法:将operator new/delete设置为私有的

    拨开自定义operator new与operator delete的迷雾.docx

    拨开自定义operator new与operator delete的迷雾

    错误:unexpected operator.docx

    错误:unexpected operator.docx

    effective stl 中文 pdf

    条款7: 当使用new得指针的容器时,切记在容器销毁前delete那些指针 条款8: 千万不要把auto_ptr放入容器中 条款9: 小心选择删除选项 条款10: 当心allocator的协定和约束 条款11: 了解自定义allocator的正统使用法...

    Effictive STL CHM中文版

    条款7: 当使用new得指针的容器时,切记在容器销毁前delete那些指针 条款8: 千万不要把auto_ptr放入容器中 条款9: 小心选择删除选项 条款10: 当心allocator的协定和约束 条款11: 了解自定义allocator的正统使用法...

    effective stl stl 技巧

    条款7:当使用new得指针的容器时,记得在销毁容器前delete那些指针 条款8:永不建立auto_ptr的容器 条款9:在删除选项中仔细选择 条款10:注意分配器的协定和约束 条款11:理解自定义分配器的正确用法 条款12...

    C++ 内存管理

    void * operator new[ ](size_t size); void operator delete[ ](void *p); // .. other members here .. }; void *TestClass::operator new[ ](size_t size) { void *p = malloc(size); return (p); } void Test...

    Effective C++(第三版)

    条款16:成对使用new和delete时要采取相同形式 use the same form in corresponding uses of new and delete. 条款17:以独立语句将newed对象置入智能指针 store newed objects in smart pointers in standalone ...

    全面解析C++中的new,operator new与placement new

    new operator/delete operator就是new和delete操作符,而operator new/operator delete是函数。 new operator(1)调用operator new分配足够的空间,并调用相关对象的构造函数(2)不可以被重载 operator new(1)只...

    Effective STL(中文)

    记得在销毁容器前delete那些指针 条款8:永不建立auto_ptr的容器 条款9:在删除选项中仔细选择 条款10:注意分配器的协定和约束 条款11:理解自定义分配器的正确用法 条款12:对STL容器线程安全性的...

    shell脚本报错:"[: =: unary operator expected"解决办法

    主要介绍了shell脚本报错:"[: =: unary operator expected"解决办法的相关资料,需要的朋友可以参考下

    27 聪明的微创新:Operator工作原理解读.pdf

    27 聪明的微创新:Operator工作原理解读.pdf

    Effective C++ 中文版

    内容简介: 有人说C++程序员可以分成两类,读过Effective C++的和没读过的。世界顶级C++大师Scott Meyers成名之作的第三版的确当得起这样的评价...8.定制new和delete 9.杂项讨论 A 本书之外 B 新旧版条款对映 索引

    解决error LNK2005 void __cdecl operator delete(void

    解决error LNK2005 void __cdecl operator delete(void

Global site tag (gtag.js) - Google Analytics