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は、実際には、以前に割り当てられたメモリを直接使用し、時間に対する要求が高く、中断されたくないアプリケーションを長時間実行するのに適しています.
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"<
#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;
}