c++ new和delete操作符的重载

先分析一条语句:

Base *pb= new Base;

这条语句是怎么执行的?首先,这个函数调用标准C++的operator new()函数,然后调用Base的构造函数。

如果我们自定义new时,可以自定义一个new,如

class Base {
    static void* operator new(size_t size) {
    }
    static void operator delete(void *p) {
    }
}

这个Base类里面的new 和delete覆盖掉标准new和标准delete,当new Base()的时候,调用的自定义的new。

new和delete也可以重载

class Base {
    static void* operator new(size_t size) {
    }
    static void operator delete(void *p) {
    }
    static void operator new(size_t size, std::ostream& out) {
    }
    static void operator delete(void *p,std::ostream& out) {
    }
}

重载的称为placement new 和placement delete。要调用placement new, 可以这样

Base *pb = new (std::cerr) Base;

至于调用placement delete,这个是不能通过delete操作符条用的的,它是为异常处理设置的。如果

Base *pb = new (std::cerr) Base;
delete pb;

调用的是operator delete(void *p),不会调用placement delete。

placement 是为异常处理设置的,接下来讲异常处理。

Base *pb= new Base;

这条命令调用两个函数,一个是operator new()分配内存空间,另一个是Base构造函数。如果Base构造函数抛出异常,那么分配之后的空间无法手段delete。因为没有指针指向这一区域。这个问题由C++自身完成,如果苟晗函数抛出异常,C++会自动调用相对应的operator delete()函数。如

Base *pb1 = new Base;
//调用operator delete(void*);
Base *pb2 = new (std::cerr) Base;
//调用operator delete(void*,std::ostream);

相对应指针式参数项对应,当然new中必有一个size_t,delete中必有一个void*,这两个参数是对应的,其他参数必须一致。

c++ new和delete操作符的重载

时间: 2024-08-01 21:43:04

c++ new和delete操作符的重载的相关文章

关于解引用*和箭头操作符->的重载

这里以一个智能指针类为例,智能指针所指为一个对象. 而事实上,STL迭代器的开发均需要重载这两个操作符,上一篇文章分析STL 迭代器中除了要用到template技巧外,还需要重载技巧 1 #include<iostream> 2 using namespace std; 3 class Screen 4 { 5 6 public: 7 friend ostream& operator<<(ostream&os, Screen &s); 8 int actio

数组操作符的重载(二十八)

我们在学习了 string 类对象后,就不禁头脑中冒出了一个问题:string 类对象还具备 C 方式字符串的灵活性吗?还能直接访问单个字符吗?那么 string 类最大限度的考虑了 C 字符串的兼容性,可以按照使用 C 字符串的方式使用 string 对象. 下来我们用 C 方式使用 string 类,看看示例代码 #include <iostream> #include <string> using namespace std; int main() {     string 

C++ new delete操作符

//new delete操作符 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; /* 1.new delete 操作符号 都是 c++的关键字 类似于 C语言中的 malloc free 2.定义对象时,使用了new关键字,会为这个对象在堆上分配内存,不使用new 关键字会直接在栈上分配内存 new 关键字可以分配基础类型内存,数组类型内存,对象类型内存 对于基础类型内存和数组类型内存,new de

js中的内部属性与delete操作符

本文正式地址:http://www.xiabingbao.com/javascript/2015/08/03/javascript-delete-configurable 在讲解Configurable之前,我们首先来看一道面试题: a = 1; console.log( window.a ); // 1 console.log( delete window.a ); // false console.log( window.a ); // 1 var b = 2; console.log( w

js小知识 delete操作符

说明:delete操作符用于删除对象的某个属性. 语法: delete object.property //删除 对象.属性 delete object['property'] //删除 对象['属性'] 返回值:bool类型,成功删除的时候回返回true,否则返回false. 注意: 如果你删除的属性在对象上不存在,那么delete将不会起作用,但仍会返回true 如果 delete 操作符删除成功,则被删除的属性将从所属的对象上彻底消失.然后,如果该对象的原型链上有一个同名属性,则该对象会从

Javascript的变量与delete操作符

原文:http://charlee.li/javascript-variables-and-delete-operator.html 刚刚看到一篇好文(原文链接), 对Javascript中的delete操作符分析得很透彻.在这里简单地介绍一下内容. 虽然是一个小小的delete操作符,其行为却异常复杂. # Javascript的变量 实际上Javascript中,变量 = 对象属性,这是因为 Javascript 在执行脚本之前 会创建一个Global对象,所有的全局变量都是这个Global

操作符的重载

1.基本 输入和输出 cout << "hello" << endl << "world"; 输出: hello world 可见,输出,endl 是换行的作用 int x; cout << "input the num what you want:"; cin >> x; cout << "the num you input is:"; cout <

C++之new和delete操作符

在C语言中的动态分配和释放内存的函数是malloc calloc 和 free , 而在C++中要用 new new[] delete delete[] 来申请动态空间和释放空间. 注意:的是new.new[].delete和delete[]是操作符,而非函数:new和delete也是C++的关键字. 操作符new用于动态分配单个空间,而new[]则是用于动态分配一个数组,操作符delete用于释放由new分配的空间,delete[]则用于释放new[]分配的一个数组. 下面是简单的实例代码 u

[转]深入详解javascript之delete操作符

最近重新温习JS,对delete操作符一直处于一知半解的状态,偶然发现一篇文章,对此作了非常细致深入的解释,看完有茅塞顿开的感觉,不敢独享,大致翻译如下. 原文地址:http://perfectionkills.com/understanding-delete/ P.S. 作者是PrototypeJS的开发组成员之一 ========分割线======== 在开始之前,先让我们看一段代码 Js代码     >>> var sum = function(a, b) {return a +