从STL源码剖析中看到了operator new的使用

template<class T>
inline void _deallocate(T* buffer) {
::operator delete(buffer);
//operator delete可以被重载
// operator delete(buffer);
}

从而开始研究一下这两个操作符

首先其实迷惑的是"::"的作用,通过以下代码测试出来了

class A {
public:
void TT() {
cout << "A" << endl;
}
};
inline void TT() {
cout<<"G"<<endl;
}
class B: public A {
public:
void TT() {
cout << "B" << endl;
::TT();
}
}; int main(int argc, char **argv) {
// new Allocator();
(new B())->TT();
return 0;
}

运行结果

B
G

用于区分全局函数和函数内局部函数的符号。

#include <iostream>
#include <vector>
#include "2jjalloca.h"
#include <new> using namespace std; //inline void *operator new(size_t n) {
//    cout << "global new" << endl;
//    return ::operator new(n);
//}
//
//inline void *operator new(size_t n, const std::nothrow_t& nt) {
//    cout << "global new nothrow" << endl;
//    return ::operator new(n, nt);
//} class Allocator {
public:
    void *operator new(size_t n) {
        cout << "allocator new" << endl;
        return ::operator new(n);
    }
    //作用域覆盖原则,即在里向外寻找operator new的重载时,
    //只要找到operator new()函数就不再向外查找,如果参数符合则通过,
    //如果参数不符合则报错,而不管全局是否还有相匹配的函数原型。
    //所以的调用new(std::nothrow) Allocator;注释这个函数是报错
    void* operator new(size_t n, const std::nothrow_t& nt) {
        cout << "allocator new nothrow" << endl;
        return ::operator new(n, nt);
    }     void* operator new(size_t n, void *p) {
        cout << "allocator placement new" << endl;
        return p;
    }     void operator delete(void *p) {
        cout << "allocator delete" << endl;
        return ::operator delete(p);
    }
    void operator delete(void*, void*) {
        cout << "allocator placement delete" << endl;
    }     void* operator new[](size_t n) {
        cout << "allocator new[]" << endl;
        return ::operator new[](n);
    }
}; int main(int argc, char **argv) {
//    Allocator *a = new Allocator;
//    delete a;
//    ::new Allcator;     Allocator *a=new Allocator[10];
    return 0;
}

参考文章

C++ 内存分配(new,operator new)详解 (有些和我尝试的不一样,第四节可以着重参考)

operator new和operator delete的更多相关文章

  1. Effective C++ 第二版 8) 写operator new 和operator delete 9) 避免隐藏标准形式的new

    条款8 写operator new 和operator delete 时要遵循常规 重写operator new时, 函数提供的行为要和系统缺省的operator new一致: 1)正确的返回值; 2 ...

  2. 从零开始学C++之重载 operator new 和 operator delete 实现一个简单内存泄漏跟踪器

    先来说下实现思路:可以实现一个Trace类,调用 operator new 的时候就将指向分配内存的指针.当前文件.当前行等信息添加进Trace 成员map容器内,在调用operator delete ...

  3. 定制自己的new和delete:operator new 和 operator delete

    new和delete不同用法 基本用法 int * aptr = new int(10); delete aptr, aptr = nullptr; 上面的代码是我们最基本也是最常见的使用new和de ...

  4. C++面向对象高级编程(九)Reference与重载operator new和operator delete

    摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...

  5. operator new 和 operator delete 实现一个简单内存泄漏跟踪器

    先来说下实现思路:可以实现一个Trace类,调用 operator new 的时候就将指向分配内存的指针.当前文件.当前行等信息添加进Trace 成员map容器内,在调用operator delete ...

  6. 类型转换运算符、*运算符重载、->运算符重载、operator new 和 operator delete

    一.类型转换运算符 必须是成员函数,不能是友元函数 没有参数 不能指定返回类型 函数原型:operator 类型名();  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 1 ...

  7. ZT 自定义operator new与operator delete的使用(1)

    http://blog.csdn.net/waken_ma/article/details/4004972 先转两篇文章: 拨开自定义operator new与operator delete的迷雾 C ...

  8. 类的operator new与operator delete的重载【转】

    http://www.cnblogs.com/luxiaoxun/archive/2012/08/11/2633423.html 为什么有必要写自己的operator new和operator del ...

  9. 条款八: 写operator new和operator delete时要遵循常规

    自己重写operator new时(条款10解释了为什么有时要重写它),很重要的一点是函数提供的行为要和系统缺省的operator new一致.实际做起来也就是:要有正确的返回值:可用内存不够时要调用 ...

随机推荐

  1. 莫烦theano学习自修第六天【回归】

    1. 代码实现 from __future__ import print_function import theano import theano.tensor as T import numpy a ...

  2. 梯度下降取负梯度的简单证明,挺有意思的mark一下

    本文转载自:http://blog.csdn.net/itplus/article/details/9337515

  3. JavaScript学习笔记之数组(二)

    JavaScript学习笔记之数组(二) 1.['1','2','3'].map(parseInt) 输出什么,为什么? ['1','2','3'].map(parseInt)//[1,NaN,NaN ...

  4. 前后端进行数据交互时候 要优先考虑json格式即简直对形式,[{}] 列表形式 等便于操作的数据结构

    前后端进行数据交互时候 要优先考虑json格式即简直对形式,[{}] 列表形式 等便于操作的数据结构

  5. 安装使用nginx

    nginx的优势 是c语言开发的一个web框架 官方声称支持10W+的并发 天下武功 唯快不破 tengine+ uwsgi(多进程) + django 你公司的技术栈是什么样? centos7 + ...

  6. puppet的常用语法

    检查语法错误 puppet parser validate xx.pp 在客户端测试但是不应用 puppet agent --test --noop 基于安全的考虑,使用预签名证书 puppet ce ...

  7. Elasticsearch 5.x 字段折叠的使用

    在Elasticsearch 5.x  之前,如果实现一个数据折叠的功能是非常复杂的,随着5.X的更新,这一问题变得简单,找到了一遍技术文章,对这个问题描述的非常清楚,收藏下. 参考:https:// ...

  8. 洛谷P1057传球游戏题解

    题目 这个题表面上看并不像DP,但是当我们看到方案数时,我们可能会想到什么??? 对,分类加法原理,在每一轮中,每一个点的方案数都要加上这个点左边的方案与右边的方案. 因此我们可以枚举,设一个DP数组 ...

  9. Java将Excel中科学计数法解析成数字

    需要注意的是一般的科学表达式是1.8E12 1.8E-12 而在Excel中的科学表达式是1.8E+12 1.8E-12 我写的科学计数法的正则表达式是(-?\d+\.?\d*)[Ee]{1}[\+- ...

  10. nginx+php使用open_basedir限制站点目录防止跨站

    以下三种设置方法均需要PHP版本为5.3或者以上.方法1)在Nginx配置文件中加入 fastcgi_param PHP_VALUE "open_basedir=$document_root ...