2012-03-20 10 views
0

可能重複:
C++'s 「placement new」如何安置新的工程在c + +?

我只是瞭解了安置新的運營商,並試圖創造我自己的內存管理器。
這裏是我的模板基類的內存

#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]是堆棧,但是析構函數沒有被調用。

任何想法?

阿圖爾

P.S ::我要實現新的[]和Memory_Base刪除[]。

+1

「placement'new'」的默認答案是「請不要」(除非您有一個非常有說服力的理由來使用它)。 – 2012-03-20 10:54:58

回答

1
MyClass obj[10]; 

在本地存儲器上分配並創建MyClass類型的10個對象。
此外,

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

只是調用構造函數。 MyClass構造函數中的this指針將等於&obj。因此返回的指針pMyClass1將等於&obj

此外,在放置new的情況下,您有責任通過顯式調用析構函數銷燬已放置的對象,因此不會調用已放置的對象析構函數。

因爲一旦程序在您的情況下返回,放置在堆棧上的對象數組將被釋放。

+0

@ obj [10]的東西,當它超出範圍時,不應該調用析構函數嗎?當我在MyClass的析構函數中放置一個斷點時,它從來沒有擊中它 – Atul 2012-03-20 10:56:50

+0

@Atul:它應該。它會發布一些痕跡並進行確認。 – 2012-03-20 11:13:39