2012-03-20 9 views
0

可能性の重複:
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のポインタを返しています、次に新しいプレースメントはどうですか?

  1. 私のobj [10]はスタックにありますが、デストラクタは呼び出されません。

アトゥール

P.S ::私は新しい[]を実装し、Memory_Baseに[]削除する必要があります。

+1

「プレースメント 'new'」のデフォルトの回答は「しないでください」です(あなたがそれを使用する魅力的な理由がない限り)。 –

答えて

1
MyClass obj[10]; 

MyClassの10個のオブジェクトをローカルストレージに割り当てて作成します。さらに

MyClass* pMyClass1 = new(&obj)MyClass(); 

ちょうどコンストラクタを呼び出します。 MyClassコンストラクタ内のthisポインタは&objに等しくなります。したがって、返されたポインタpMyClass1&objに等しくなります。

また、配置newの場合、明示的にデストラクタを呼び出すことによって配置されたオブジェクトを破壊することはあなたの責任であり、配置されたオブジェクトのデストラクタは暗黙的に呼び出されることはありません。

スタックに配置されたオブジェクトの配列は、プログラムがあなたのケースで返ったときに割り当て解除されるため、

+0

@ obj [10]のこと、スコープを外れたときに、デストラクタを呼び出すべきではないでしょうか?私がMyClassのデストラクタにブレークポイントを置くと、決してヒットしません。 – Atul

+0

@Atul:それはすべきです。それは、いくつかのトレースステートメントを入れ&確認します。 –

関連する問題