`
kmplayer
  • 浏览: 509006 次
  • 性别: 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的区别

    在C++编程中,`new`操作符和`operator new`是两个密切相关但不完全相同的概念,它们在内存管理和对象创建方面各自承担着特定的角色。 `new`操作符是C++语言内置的关键字,用于在堆上动态分配内存并创建对象。当执行...

    错误:unexpected operator.docx

    在 Shell 编程中,遇到「unexpected operator」错误时,不少开发者会感到困惑。今天,我们将深入探讨这类错误的成因和解决方法。 错误的成因 「unexpected operator」错误通常是由于 Shell 解释器的不兼容性所导致...

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

    在C++编程中,自定义`operator new`和`operator delete`是实现特定内存管理策略的重要手段。它们允许程序员根据需求调整内存分配和释放的行为。本文将深入探讨这两个操作符的自定义规则、使用场景以及潜在的陷阱。 ...

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

    标题和描述提到的方法是通过将`operator new`和`operator delete`设置为私有来实现这一目标。下面我们将详细探讨这个主题。 首先,`operator new`和`operator delete`是C++中的全局运算符,用于动态内存分配和释放...

    关于new和delete的详细用法

    关于new和delete的详细用法 1. new是C++的一个关键字,同时也是操作符。它可以用于在堆上动态创建一个对象,实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。 2. new的三种形态:new operator...

    006_OSQP: An Operator Splitting Solver forQuadratic Programs

    OSQP(Operator Splitting Solver for Quadratic Programs)是一种用于求解凸二次规划问题的高效算法。二次规划是优化领域中的核心问题,它涉及到寻找一个向量x,使其在满足线性约束的同时,使得以x为变量的二次函数...

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

    在使用Shell脚本编程时,有时我们可能会遇到一个常见的错误提示:“[: =: unary operator expected”。这个错误通常出现在我们尝试进行条件判断时,尤其是当我们在`if`语句中使用`[ ... ]`或者`[[ ... ]]`进行比较...

    Effictive STL CHM中文版

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

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

     在运行时出现了 [: =: unary operator expected 的错误,就一直找不到原因,尝试了删除等号两侧的空格和括号里的空格都不管用,最后baidu了一下,才找到原因。把语句改成这样就不会出错了. if [[ $STATUS = OK ]]...

    C++_new_operator详解

    `new`操作符在内部会调用两个重要的函数:`operator new` 和 `placement new`。 #### 二、new操作符的三种形式 1. **new操作符**:这是最常用的形式,用于动态创建一个对象或数组。 2. **operator new**:这是一个...

    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...

    重写全局new/delete示例

    在C++编程中,全局`new`和`delete`操作符是用于动态内存分配和释放的关键部分。有时候,为了满足特定需求,如内存池管理、内存跟踪、异常安全或者资源的特殊处理,开发者可能需要重写这些全局操作符。本文将深入探讨...

    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)只...

    SAM分割模型onnx导出模型问题:Exporting the operator repeat-interleave to ON

    Exporting the operator repeat_interleave to ONNX opset version 11 is not supported TypeError: 'torch._C.Value' object is not iterable (Occurred when translating repeat_interleave). 问题解决: 1....

    c语言中new_C++的new归纳详解

    在 C++ 中,new 和 delete 是成对出现的,其中 delete 也有 delete operator 和 operator delete 之分。operator delete 也是可以重载的,并且,如果重载了 operator new,就应该也相应的重载 operator delete,这是...

    解决error LNK2005 void __cdecl operator delete(void

    标题中的“error LNK2005 void __cdecl operator delete(void)”是一个常见的链接错误,它在C++编程中出现,通常涉及到多库编译时的符号重定义问题。这个错误表明在链接阶段发现了一个重复定义的`operator delete`...

Global site tag (gtag.js) - Google Analytics