new\delete
1、new oprator要完成的兩部分
<1>配置設定記憶體,有oprator new 來做
<2> 調用構造函數初始化記憶體中的對象
2、oprator new
作用;傳回未處理的指針和未初始化的記憶體
原型 :void * operator new(size_t size);
重載全局的oprator new
<1>
void* operator new(size_t size)
{
printf("global newn");
return malloc(size);
}
<2> 調用全局的new
class A
{
public:
void* operator new(size_t size)
{
printf("operator new calledn");
return ::operator new(size);
}
};
A* a = new A();
3、placement new
使用的場景:定制化構造函數,用自己的構造函數來初始化記憶體
作用是在一個已經配置設定好的記憶體中(棧或者堆中)構造一個新的對象
是new oprator的第二步
使用方法如下:
<1>. 緩沖區提前配置設定
可以使用堆的空間,也可以使用棧的空間,是以配置設定方式有如下兩種:
class MyClass {…};
char *buf=new char[N*sizeof(MyClass)+sizeof(int)];或者char buf[N*sizeof(MyClass)+sizeof(int)];
<2>. 對象的構造
MyClass * pClass=new(buf) MyClass;
<3>. 對象的銷毀
一旦這個對象使用完畢,你必須顯式的調用類的析構函數進行銷毀對象。但此時記憶體空間不會被釋放,以便其他的對象的構造。
pClass->~MyClass();
#include <iostream>;
using namespace std;
class T {
public:
T() { cout << "constructor" << endl; }
~T() { cout << "destructor" << endl; }
};
int main()
{
const int NUM = 3;
T* p1 = new T[NUM];
cout << hex << p1 << endl;
// delete[] p1;
delete p1;
T* p2 = new T[NUM];
cout << p2 << endl;
delete[] p2;
}