可能性の重複:
C++'s “placement new”C++での配置の新機能
私はちょうど配置new演算子を学んだと私自身のメモリマネージャを作成してみました。
ここ は私が私のメインで、
#ifndef _MY_CLASS_H_
#define _MY_CLASS_H_
//=========================!
#include "Memory_Base.h"
//=========================!
class MyClass :public Memory_Base<MyClass>
{
private :
int ma;
public :
MyClass():ma(-1){}
~MyClass(){}
};
//============================!
#endif
今、以下のようにのように、別のヘッダファイルに、MyClassのクラスの上から何かを継承し、今メモリ
#ifndef _MEMORY_BASE_H_
#define _MEMORY_BASE_H_
//=========================================!
#include <new>
#include <exception>
#include <iostream>
//=========================================!
using namespace std;
//=========================================!
template <typename T>
class Memory_Base
{
public :
//standard new
void* operator new(size_t T);
// placement new
void* operator new(size_t T,void* pAddress);
//standard delete
void operator delete(void* pAny);
};
//=========================================!
// Implementation
//=========================================!
template <typename T>
void* Memory_Base<T>::operator new(size_t T)
{
cout << "Memory_Base<T>:: new called" << endl;
void* pTemp = malloc(sizeof(T));
if(!pTemp)
throw bad_alloc();
else
return pTemp;
}
//=========================================!
template <typename T>
void* Memory_Base<T>::operator new(size_t T,void* pAddress)
{
cout << "Memory_Base<T>:: placement new called" << endl;
return pAddress;
}
//=========================================!
template <typename T>
void Memory_Base<T>::operator delete(void* pAny)
{
cout << "Memory_Base<T>:: delete called" << endl;
free(pAny);
}
//=========================================!
#endif
のための私のテンプレート基本クラスのコードです、私は次のように
//============================!
#include "MyClass.h"
//============================!
int main()
{
// This is how new for MyClass is called
MyClass* pMyClass = new MyClass();
// This is how placement new for MyClass is called
MyClass obj[10];
MyClass* pMyClass1 = new(&obj)MyClass();
return 0;
}
//============================!
質問はMyClassのオブジェクトを作成しようとしています::
1.私がmainを実行すると、objとpMyClass1のベースアドレスは同じであった。しかし、私はちょうどpAddressのポインタを返しています、次に新しいプレースメントはどうですか?
- 私のobj [10]はスタックにありますが、デストラクタは呼び出されません。
アトゥール
P.S ::私は新しい[]を実装し、Memory_Baseに[]削除する必要があります。
「プレースメント 'new'」のデフォルトの回答は「しないでください」です(あなたがそれを使用する魅力的な理由がない限り)。 –