C++ new 解析重载 .

转载 2015年07月08日 18:30:34

C++ new 解析重载 . - 莫水千流 - 博客园
http://www.cnblogs.com/zhoug2020/archive/2012/04/06/2434139.html


C++ new 解析重载 .

C++ new用法之一 new运算符

最常用的是作为运算符的new,比如:

string *str = new string(“test new”);

作为运算符,new和sizeof一样,是C++内置的,你不能对它做任何的改变,除了使用它。

new会在堆上分配一块内存,并会自动调用类的构造函数。

C++ new用法之二 new函数

第二种就是new函数,其实new运算符内部分配内存使用的就是new函数,原型是:

void *operator new(size_t size);

new函数返回的是一个void指针,一块未经初始化的内存。如你所见,这和C语言的malloc行为相似,你可以重载new函数,并且增加额外的参数,但是必须保证第一个参数必须是size_t类型,它指明了分配内存块的大小,C++允许你这么做,当然一般情况下这是不必要的。如果重载了new函数,在使用new操作符时调用的就是你重载后的new函数了。

如果使用new函数,和语句string *str = new string(“test new”)相对的代码大概是如下的样子:

 

  1. string *str = (string*)operator new(sizeof(string));
  2. str.string(“test new”);
  3. // 当然这个调用时非法的,但是编译器是没有这个限制的

 

这还不算完,还有第三种的new存在。

C++ new用法之三 placement new

第三种,placement new,这也是new作为函数的一种用法,它允许你在一块已存在的内存上分配一个对象,而其他内存上的数据不会被覆盖或者被你主动改写,placement new同样由new操作符调用,调用格式是:

new (buffer) type(size_t size);

先看看下面的代码:

 

  1. char str[22];
  2. int data = 123;
  3. int *pa = new (&data) int;
  4. int *pb = new (str) int(9);

 

结果*pa = 123(未覆盖原数据),而*pb = 9(覆盖原数据),可以看到placement new 并没有分配新的内存,也可以使用在栈上分配的内存,而不限于堆。

为了使用placement new 你必须包含<new>或者<new.h>

其实placement new和第二种一样,只不过多了参数,是函数new的重载,语法格式为:

void *operator new(size_t, void* buffer);

它看起来可能是这个样子:

void *operator new(size_t, void* buffer) { return buffer;}

 

和new对应的就是delete了,需要回收内存啊,不然就泄漏了,这个下次再写吧,回忆一下今天的内容先。

总结

1. 函数new

void *operator new(size_t size); 在堆上分配一块内存,和placement new(void *operator new(size_t, void* buffer)); 在一块已经存在的内存上创建对象,如果你已经有一块内存,placement new会非常有用,事实上,它STL中有着广泛的使用。

2. 运算符new

最常用的new,没什么可说的。

3. 函数new不会自动调用类的构造函数,因为它对分配的内存类型一无所知;而运算符new会自动调用类的构造函数。

4. 函数new允许重载,而运算符new不能被重载。

5. 紧接着就是对应的delete。

C++的三种new简介及重载局部(类内部)与全局operator new

先简单解释下C++的三种new,由于它们的名字实在是。。我就说的通俗点。1、new运算符(new operator)大哥,我们在代码中直接使用的就是它。它做2件事:调用后两种new申请内存和初始化对象...
  • qq_29227939
  • qq_29227939
  • 2016年06月11日 21:35
  • 3366

c++ 中的重载全局new,delete

最近做一个小项目,对c++又有很多新的理解。实在不的不让人发出感叹,c++太强大了,绝对不是一朝一夕就可以领悟她的内涵的。        首先我们要清楚,为什么我们要重载new,和delete了?这...
  • u012543266
  • u012543266
  • 2013年11月04日 09:08
  • 6358

C++重载new,以及实现检测内存泄露版本的new

在c++中,new作为一个操作符,也是可以被重载的,这个可能很多人比较陌生。在 Effective C++这本书中,专门提到了这方面的知识,看过此书,做一些总结,顺便在网上找到一些内容,实现一个可以检...
  • hopeztm
  • hopeztm
  • 2012年09月13日 21:03
  • 3501

C++的new 和 delete 操作符重载。

测试代码: // test.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include using name...
  • chjjunking
  • chjjunking
  • 2014年03月04日 12:16
  • 2763

详解重载解析(一)

一.前言什么是重载解析呢? 我们要解释重载解析就要先了解重载。当我们对同一个函数名写了不同参数列表的版本之后,编译器会生成这个函数的不同重载版本。那么当我们调用这个函数的时候,编译器就会子自动根据实参...
  • y1196645376
  • y1196645376
  • 2016年10月19日 15:38
  • 715

c++ new 重载

转自: #include #include void * operator new(size_t unSize) { printf("operator new called\n")...
  • occupy8
  • occupy8
  • 2016年03月15日 20:47
  • 376

C++new() 的六种重载形式

当写出p = new P();这样的代码的时候, 实际上有两步操作, 首先分配内存,然后在分配好的内存之上初始化类成员. 第二步是有构造函数完成的, 第一步就是new函数的工作. 全局...
  • Sun19910114
  • Sun19910114
  • 2014年10月01日 11:12
  • 254

C++ new 解析重载

转自:http://hi.baidu.com/%C4%E3%CE%D2%CB%FD_%CD%AC%C2%B7%C8%CB/blog/item/aa4230d7bfe622cf50da4b28.html...
  • normallife
  • normallife
  • 2011年02月23日 15:51
  • 586

重载new和delete的一些规则

重载new和delete的一些规则重载new和delete的一些规则 一般规则 特殊规则1 特殊规则2 特殊规则3 new和delete重载实例 直接获取当前的new_handler 转载请注明出处参...
  • sanoseiichirou
  • sanoseiichirou
  • 2015年11月20日 23:18
  • 1310

C++:重载全局new/delete实现跨平台多线程内存检测

实现类: DumpMemoryLeaks.h
  • u014023615
  • u014023615
  • 2014年09月25日 14:12
  • 657
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ new 解析重载 .
举报原因:
原因补充:

(最多只允许输入30个字)