gpt4 book ai didi

c++ - placement new 在 C++ 中是如何工作的?

转载 作者:行者123 更新时间:2023-11-28 08:08:12 25 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
C++'s “placement new”

我刚刚了解了 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,那么 placement new 是如何工作的呢?

  1. 我的 obj[10] 在堆栈中,但是未调用析构函数。

有什么想法吗?

阿图尔

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com