(轉(zhuǎn)載)C++教程網(wǎng)www.cppcourse.com
new有三種用法:new operator、operator new、placement new
new operator
new operator是最常見的用法,如 Emp* e1 = new Emp;(Emp是一個(gè)類) 這里new有兩種作用:分配空間、初始化對(duì)象(調(diào)用了構(gòu)造函數(shù))
operator new
operator new作用是只分配空間,不調(diào)用構(gòu)造函數(shù),如:Emp* e2 = (Emp*)operator new(sizeof(Emp));
placement new
placement new作用是在已分配好的空間上初始化對(duì)象,不分配空間,調(diào)用拷貝構(gòu)造函數(shù),如:new ((void *)e2) Emp(*tb1);
示例代碼如下:
// Emp.h#ifndef _EMP_H_#define _EMP_H_
class Emp
{
public:
Emp();
Emp(const Emp& other);
~Emp();
};
#endif // _EMP_H_
// Emp.cpp
#include “Emp.h”
#include <iostream>
using namespace std;
Emp::Emp()
{
cout<<“Emp…”<<endl;
}
Emp::Emp(const Emp& other)
{
cout<<“Copy Emp…”<<endl;
}
Emp::~Emp()
{
cout<<“~Emp…”<<endl;
}
// main.cpp
#include “Emp.h”
#include <iostream>
void main()
{
using namespace std;
// new operator 分配空間,調(diào)用構(gòu)造函數(shù)
Emp* e1 = new Emp;
// operator new 只分配空間
Emp* e2 = (Emp*)operator new(sizeof(Emp));
// placement new 不分配空間,調(diào)用拷貝構(gòu)造函數(shù)
new ((void *)e2) Emp(*e1);
// 顯示調(diào)用析構(gòu)函數(shù)
e2->~Emp();
// 僅釋放空間,不調(diào)用析構(gòu)函數(shù)
operator delete(e2);
// 調(diào)用析構(gòu)函數(shù),釋放空間
delete e1;
}