newの理解

3287 ワード

符号化の過程で、私たちはnewをよく使ってスタックメモリを割り当てます.MyClass *p = new Myclass; この過程で、実際には3つのステップを経験した:1.Openator newを呼び出してスタックメモリを割り当てます.  void *pV = operator new(sizeof(MyClass)) 2.MyClassのコンストラクタを呼び出すMyClass::MyClass();3.placement newを呼び出してクラス対応ポインタMyClass*p=new(pV)MyClassを返す.
Newはリロードできません.operator newだけがリロードできます.operator newには6つの形式があります.
//メモリ割り当て失敗投げ異常void*operator new(std::size_t count)throw(std::bad_alloc);   void  operator delete(void *) throw();//メモリ割り当てに失敗しても異常void*operator new(std::size_t count,const std::nothrow_t&)throw();void  operator delete(void*, const nothrow_t&) throw();//placementバージョン、void*operator new(std::size_t count,void*ptr)throw(){return ptr;};
//対応する配列バージョンvoid*operator new[](std::size_t count)throw(std::bad_alloc);void  operator delete[](void*) throw(); void *operator new[](std::size_t count,  const std::nothrow_t&) throw(); void  operator delete[](void* p, void*) throw() { } void* operator new[](size_t, void* ptr)  throw()  { return ptr; } void  operator delete[](void* p, void*) throw() { }
operator newのリロードにより、独自のメモリ割り当て関数をカスタマイズできます.void* operator new(unsigned int size) {   cout<<"Haha,this is my operator new"<placement newの役割は、割り当てられたメモリ(スタックもスタックも可能)に新しいオブジェクトを構築することです.placement newプロトタイプのvoid*pは、実際には割り当てられたメモリバッファのヘッダアドレスを指します.placement newは、実際には、以前に割り当てられたメモリを直接使用し、時間に対する要求が高く、中断されたくないアプリケーションを長時間実行するのに適しています.
 
#include <iostream>
using namespace std;

enum Rank { demoted = 0, promoted = 1 };

//operator new, num 
void *operator new(std::size_t count, Rank, int , int, int)
{
  cout<<"This is my operator new"<<endl;
  static int num = 0;
  void * tmp_p = malloc(count);
  ++num;
  cout<<"allocate times: "<<num<<endl;
  return tmp_p;
}

void  operator delete(void *mem) 
{
  cout<<"This is my operator delete"<<endl;
  static int num = 0;
  free(mem);
  ++num;
  cout<<"release times: "<<num<<endl;
}

void  operator delete(void *mem, Rank, int , int, int) 
{
  cout<<"This is my operator delete with parameters"<<endl;
  static int num = 0;
  free(mem);
  ++num;
  cout<<"release times: "<<num<<endl;
}

class MyClass
{
public:
  MyClass()
  {
    cout<<"This is MyClass constructor"<<endl;
  }
  ~MyClass()
  {
    cout<<"This is MyClass destructor"<<endl;
  }  
  int var_;
};

int main()
{
  // new, delete 
  MyClass* const myClass_p =  new (demoted,1,2,3) MyClass();
  
  delete  myClass_p;
  // delete
  //delete(demoted,1,2,3)  myClass_p; 
      
  cout<<"***********************************************************************"<<endl;
  
  // operator new placement new
  void * void_p = operator new(sizeof(MyClass),demoted,1,2,3);
  MyClass *myClass_p_2 = new(void_p)MyClass();
  //operator placement new
  //MyClass *myClass_p_2 = (MyClass*)(operator new(sizeof(MyClass),void_p));  
	
  myClass_p_2->~MyClass();
  operator delete (myClass_p_2);
  // delete
  //operator delete (myClass_p_2,demoted,1,2,3);  
  return 1;
}