0

重複の可能性:
C++ の「placement new」

プレースメント new 演算子について学び、独自のメモリ マネージャーを作成してみました。
メモリのテンプレート基本クラスのコードは次のとおりです

#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

今、私は上記のクラスから myclass を継承し、別のヘッダーファイルで、以下のようなものです

#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 のオブジェクトを作成しようとしています

//============================!
#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;
}
//============================!

質問 ::
1. main を実行すると、予想どおり、obj と pMyClass1 のベース アドレスが同じでした。ただし、ポインター pAddress を返すだけで、新しい配置はどのように機能しますか?

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

何か案は ?

アトゥル

PS :: Memory_Base に new[] と delete[] を実装する必要があります。

4

1 に答える 1

1
MyClass obj[10]; 

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

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

コンストラクターを呼び出すだけMyClass::MyClass()です。コンストラクターのthisポインターはMyClassと等しくなり&objます。したがって、返されるポインタpMyClass1 は と等しくなり&objます。

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

したがって、スタックに配置されたオブジェクトの配列は、プログラムがケースに戻ると割り当てが解除されます。

于 2012-03-20T10:52:23.167 に答える