如何在c ++中放置新的工作?

时间:2012-03-20 10:42:19

标签: c++ memory-management placement-new

  

可能重复:
  C++'s “placement 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],在堆栈中,但是,析构函数没有被调用。
  2. 有什么想法吗?

    Atul

    P.S ::我必须在Memory_Base中实现new []和delete []。

1 个答案:

答案 0 :(得分:1)

MyClass obj[10]; 

在本地存储上分配并创建10个MyClass类型的对象 此外,

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

只需调用构造函数MyClass::MyClass()即可。 this构造函数中的MyClass指针将等于&obj。因此,返回的指针pMyClass1将等于&obj

此外,在放置new的情况下,您有责任通过显式调用析构函数来销毁放置的对象,放置的对象析构函数不会被无意中调用。

因为,在你的情况下程序返回后,放置在堆栈上的对象数组将被释放。