newoperator newplacement new

Posted zj_qianzi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了newoperator newplacement new相关的知识,希望对你有一定的参考价值。

new :操作符

  class MyClass {...}; 
   MyClass *p = new MyClass; 

分以下三个步骤

1. 调用operator new分配内存

2. 调用构造函数生成类对象

3. 返回相应指针

operator new:分配内存

1.缺省情况下,C++在global作用域内提供以下三种形式的operator new

void* operator new(std::size_t)throw(std::bad_alloc);  //正常的operator new,new MyClass分配空间调用的即为该函数

void* operator new(std::size_t, void*)throw();       //placement new:带有除size_t外的参数;void*表示已分配的空间,该函数表示在已分 配的空间上去创建对象;已  被纳入C++标准,需#include <new>

void* operator new(std:;size_t,std:Lnothrow_t&) throw(); //nothrow new

placement new:对operator new的重载,在已分配的空间上创建对象

大家谈到的placement new大多为此版本:void* operatornew(std::size_t, void*) throw();

注意点:

1.placement new还可在自身类中定义带各种不同参数版本,如:void* operator new(std::size_t, std::ostream&logStream);

2.需定义匹配的placement delete,void* operatordelete(void* pMemory, std::ostream& logStream);

        否则系统找不到匹配的placement delete,有可能导致内存泄露;  只有在“伴随placement new 调用而触发的构造函数出现异常时才会被调用”,如:Widget* pw = new (std::err) Widget;构造函数出现异常,会调用该版本的placement delete

3.delete pw; //只会调用正常的operator delete:void operatordelete(void *pMemory) thorw();,而不会调用placement delete(表示除带有void* pMemory参数外,还有别的参数)

以上是关于newoperator newplacement new的主要内容,如果未能解决你的问题,请参考以下文章

C++ 动态内存分配 new / deleteoperator newplacement new

C++中的newoperator new与placement new

malloc vs new && delete vs delete[]

对C++中new的认识

C++内存管理(new operator/operator new/operator delete/placement new)

使用jquery快速移动元素的方法