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

条款8 写operator new 和operator delete 时要遵循常规 重写operator new时, 函数提供的行为要和系统缺省的operator new一致: 1)正确的返回值; 2)可用内存不够时调用出错处理函数; 3)处理0字节内存请求的情况; 避免隐藏标准形式的new; 1)如果内存分配请求成功, 返回指向内存的指针, 失败抛出std::bad_alloc异常;  operator new实际上不止一次尝试分配内存, 每次失败会调用出错处理函数(期望释放别处的内存), 只…
先来说下实现思路:可以实现一个Trace类,调用 operator new 的时候就将指向分配内存的指针.当前文件.当前行等信息添加进Trace 成员map容器内,在调用operator delete 的时候删除这些信息.定义一个全局Trace 对象,当程序结束,对象析构时判断成员map 是否还有信息,如果有则打印出来,表示已经发生内存泄漏,从输出可以看出是哪一个文件哪一行分配了内存但没有释放掉. DebugNew.h:  C++ Code  1 2 3 4 5 6 7 8 9   #ifnde…
new和delete不同用法 基本用法 int * aptr = new int(10); delete aptr, aptr = nullptr; 上面的代码是我们最基本也是最常见的使用new和delete的方式,当编译器运行int * aptr = new int(10); 这行代码时,其实是分为两个步骤来执行,第一步,调用operator new(size_t size) 分配内存:第二步在分配的内存上调用placement new(void * ptr) T(); "定位放置 new&q…
摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nullptr 2.引用之后不能再引用别人 3.引用通常不用于声明变量,多用于参数类型,和返回值类型 见下面代码 int main(int argc, const char * argv[]) { ; //p is a pointer to x int* p = &x; // r is a referen…
先来说下实现思路:可以实现一个Trace类,调用 operator new 的时候就将指向分配内存的指针.当前文件.当前行等信息添加进Trace 成员map容器内,在调用operator delete 的时候删除这些信息.定义一个全局Trace 对象,当程序结束,对象析构时判断成员map 是否还有信息,如果有则打印出来,表示已经发生内存泄漏,从输出可以看出是哪一个文件哪一行分配了内存但没有释放掉. DebugNew.h:  C++ Code  1 2 3 4 5 6 7 8 9   #ifnde…
一.类型转换运算符 必须是成员函数,不能是友元函数 没有参数 不能指定返回类型 函数原型:operator 类型名();  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23   #ifndef _INTEGER_H_ #define _INTEGER_H_ class Integer { public:     Integer(int n);     ~Integer(); Integer &operato…
http://blog.csdn.net/waken_ma/article/details/4004972 先转两篇文章: 拨开自定义operator new与operator delete的迷雾 C++允许用户通过自定义operator new和operator delete的方式来更改new与delete表达式的某些行为,这给了程序员定制内存管理方案的自由.但是享受这种自由的时候必须遵守一定的规范,具体可以参见<Effective C++ 2nd>的相关条款.本文补充解释一些特别容易引起误…
http://www.cnblogs.com/luxiaoxun/archive/2012/08/11/2633423.html 为什么有必要写自己的operator new和operator delete? 答案通常是:为了效率.缺省版本的operator new是一种通用型的内存分配器,它必须可以分配任意大小的内存块.同样,operator delete也要可以释放任意大小的内存块.operator delete想弄清它要释放的内存有多大,就必须知道当初operator new分配的内存有多…
自己重写operator new时(条款10解释了为什么有时要重写它),很重要的一点是函数提供的行为要和系统缺省的operator new一致.实际做起来也就是:要有正确的返回值:可用内存不够时要调用出错处理函数(见条款7):处理好0字节内存请求的情况.此外,还要避免不小心隐藏了标准形式的new,不过这是条款9的话题. 有关返回值的部分很简单.如果内存分配请求成功,就返回指向内存的指针:如果失败,则遵循条款7的规定抛出一个std::bad_alloc类型的异常.operator new实际上会不…
从STL源码剖析中看到了operator new的使用 template<class T> inline void _deallocate(T* buffer) { ::operator delete(buffer); //operator delete可以被重载 // operator delete(buffer); } 从而开始研究一下这两个操作符 首先其实迷惑的是"::"的作用,通过以下代码测试出来了 class A { public: void TT() { cou…
new operator new operator即是c++中的关键字new.比如A* = new A; 中的new就是new operator. 它执行了三个步骤: 1. 分配内存空间 事实上,分配内存这一操作就是由operator new(size_t)来完成的,如果类A重载了operator new,那么将调用A::operator new(size_t ),否则调用全局::operator new(size_t ),后者由C++默认提供. 2. 构造对象 以上面的例子来说,就是调用A::…
Token-Pasting Operator (##)The double-number-sign or “token-pasting” operator (##), which is sometimes called the “merging” operator, is used in both object-like and function-like macros. It permits separate tokens to be joined into a single token an…
http://www.younfor.com/cpp-new-placement-new-operator-new.html http://www.cnblogs.com/luxiaoxun/archive/2012/08/10/2631812.html http://kelvinh.github.io/blog/2014/04/19/research-on-operator-new-and-delete/ new operator 就是C++中定义的关键字new,调用new而触发的行为,del…
new operator/delete operator就是new和delete操作符,而operator new/operator delete是函数. new operator(1)调用operator new分配足够的空间,并调用相关对象的构造函数(2)不可以被重载 operator new(1)只分配所要求的空间,不调用相关对象的构造函数.当无法满足所要求分配的空间时,则        ->如果有new_handler,则调用new_handler,否则        ->如果没要求不…
条款10 写了operator new就要同时写operator delete 写operator new和operator delete是为了提高效率; default的operator new和operator delete具有通用性, 也可以在特定情况下被重写以改善性能; 特别在需要动态分配大量的很小的对象的应用程序中; 1 2 3 4 5 6 7 class  AirplaneRep { ... };  // 表示一个飞机对象 class  Airplane { public : ...…
思考:在C++类中,通过设计类的构造和析构函数,就已经把复杂的内存管理起来了. 及时是简单的结构体,也是有构造和析构函数的,而下面这种情况,可以在非结构中使用. /** Operator Overload new and delete */ #include <iostream> #include <cstdlib> #include <new> using namespace std; class MyClass{ public: MyClass(){ x = y =…
为什么有必要写自己的operator new和operator delete? 答案通常是:为了效率.缺省的operator new和operator delete具有非常好的通用性,它的这种灵活性也使得在某些特定的场合下,可以进一步改善它的性能.尤其在那些需要动态分配大量的但很小的对象的应用程序里,情况更是如此. 例如有这样一个表示飞机的类:类airplane只包含一个指针,它指向的是飞机对象的实际描述(此技术在条款34进行说明): class airplanerep { ... }; //…
new operator 我们平时使用的new是new操作符(new operator),就像sizeof一样是语言内置的,不能改变它的含义,功能也是一样的 比如: string *ps = new string("Memory Management"); 相当于 void *memory = operator new(sizeof(string)); // 得到未经处理的内存,为String对象 call string::string("Memory Management&…
已经一年半没有写过博客了,最近发现学过的知识还是需要整理一下,为知笔记,要开始收费了以前写在为知笔记上笔记也会慢慢的转到博客里. 话不多说,进入正题. 考虑考虑以下场景: 当某个对象对自身赋值时,会出现什么现象?? 例子: #include <iostream> class A { private: int *arr; public: A() { arr = new int[256]; } ~A() { delete arr; } const A& operator=(const A…
浅谈new operator.operator new和placement new C++中使用new来产生一个存在于heap(堆)上对象时,实际上是调用了operator new函数和placement new函数.new即new operator,是C++保留的关键字,我们无法改变其含义,但我们可以改变new完成它功能时调用的两个函数,operator new()和placement new().operator new()用于申请heap空间,功能类似于malloc(),placement…
原文地址:http://www.cnblogs.com/jamesmile/archive/2010/04/17/1714311.html,在此感谢 C++中的operator new与new operator,看上去挺像的两姐妹,却有天壤之别. 重载的 operator new 必须是类成员函数或全局函数,而不可以是某一名空间之内的函数或是全局静态函数.此外,还要多加注意的是,重载 operator new 时需要兼容默认的 operator new 的错误处理方式,并且要满足 C++ 的标准…
一.原生operator new 我们先从原生operator new开始.考虑如下代码,它用来分配5个int型的空间并返回指向他们的指针[1]: int* v = static_cast<int*>(::operator new(5 * sizeof(*v))); 当像如上的调用,operator new扮演原生的内存分配角色,类似malloc.上面等价于: int* v = static_cast<int*>(malloc(5 * sizeof(*v))); 释放用operat…
什么是自我赋值,就是 v = v 这种类型的语句,也许很多人都会说鄙视这种写法,但是如下的写法会不会出现呢? 比如:a[i] = a[j];      // 不巧的是i可能和j相等 *px = *py;     // 也许px和py刚好指向同一个对象呢 上述例子都是隐含的自我赋值. 再举一例: class Bitmap // 位图类 { ... }; class Widget { public: Widget& operator=(const Widget& rhs); private:…
对于用户没有定义dctor(包括其所有成员)的类来说, new CLASS[n] 可能会直接请求sizeof(CLASS)*n的空间. 而带有dctor的 类, 因为delete[]的时候要逐个调用析构函数, 要保证调用n次析构. C++标准没有指定如何具体处理这种情况. 而对于很多数编译器来说, 是在请求的内存前面, 保存对象的个数n(放在其头部). sizeof(int)  sizeof(CLASS)  ...       n Object[0] Object[1] Object[2] ..…
本文主要讲述C++ new运算符和operator new, placement new之间的种种关联,new的底层实现,以及operator new的重载和一些在内存池,STL中的应用. 一 new运算符和operator new():      new:指我们在C++里通常用到的运算符,比如A* a = new A;  对于new来说,有new和::new之分,前者位于std      operator new():指对new的重载形式,它是一个函数,并不是运算符.对于operator ne…
1.自我赋值,看起来愚蠢,但是却合法.有些自我赋值一眼就可看出来.有些自我赋值是潜在的.比如:a[i] = a[j]; *px = *py; 甚至不同类型的指针,都指向同一个地址,也是自我赋值,这一类自我赋值,很难识别,因此对自我赋值要有一定的防范. 2.对于资源管理类auto_ptr和shared_ptr,自我赋值是安全的.如果自行管理资源,比如Widget中有个Bitmap* pb:copy赋值如下: Widget& Widget::operator=(const Widget& rh…
条款17 在operator=中检查给自己赋值的情况 1 2 3 class  X { ... }; X a; a = a;  // a 赋值给自己 >赋值给自己make no sense, 但却是合法的; 重要的是, 赋值给自己的情况可以以隐蔽的形式出现: a = b; 如果b是a的另一个名字(初始化为a的引用), 那也是对自己赋值; 这是一个别名的例子: 同一个对象有两个以上的名字; 别名可以以任意形式的伪装出现, 在写函数时一定要考虑到; Note 赋值运算符中要特别注意可能出现别名的情况…
一.何谓“自我赋值”? 1.1.场合一 直接赋值 w = w; 1.2.场合二 同一数组         a[i] = a[j]: 1.3.场合三 指针         *px = *py: 1.4.场合四 同一继承体系         class Base{...};         class Derived: class Base{...}; 二. 自我赋值时,可能发生的问题 2.1.问题一 使用资源之前,资源已经被释放 例: class Bitmap{...}; class DeskTo…
假设你建立一个class 用来保存一个指针指向一块动态分配的位图. class Bitmap {......}; class Widget{ ... private: Bitmap* pb ; }; Widget& Widget::operator= (const Widget& rhs) { delete pb; pb = new Bitmap(*rhs.pb); return *this; } 上面是一份不安全的 operator= 实现版本,因为 operator= 函数内的*thi…
行与不行,就凭我这水平,说出来未免显示太过自大.不还,我还想根据自己的代码来讨论这个问题. 重载operator new来检测内存只的办法,那就是在new的时候记录指针地址及文件名.行号,在delete的时候取消记录.到最后程序结束,还有哪些指针未释放,则为泄漏. 第一步,你得重载operator new,或者也可以重写.在http://www.cplusplus.com/reference/new/operator%20new/中指明new有三种形式,因为我们还分配数组,故还有new[]这个函…