标签:自动调用 使用步骤 out 程序 des 库函数 垃圾 cto 否则
通过 operator new 申请内存
调用构造函数(简单类型忽略此步)
返回内存指针
using namespace std;
class T
{
public:
T()
{
cout << "constructor\n";
}
~T()
{
cout << "deconstructor\n";
}
void * operator new(size_t sz)
{
T* t = (T*)malloc(sizeof(T));
cout << "malloc memory\n";
return t;
}
void operator delete(void* p)
{
free(p);
cout << "free memory\n";
}
};
int main()
{
T* t = new T{};
delete t;
return 0;
}
输出:
malloc memory
constructor
deconstructor
free memory
new 的三种形态:
上面所说的 new 就是 new operator,共有三个步骤组成(申请内存,调用构造函数,返回内存指针)。
只分配所要求的空间,不调用相关对象的构造函数。当无法满足所要求分配的空间时,则如果有 new_handler,则调用 new_handler,否则如果没要求不抛出异常(以 nothrow 参数表达),则执行 bad_alloc 异常,否则返回 0。
placement new 是重载operator new 的一个标准、全局的版本,它不能够被自定义的版本代替。
声明在头文件 <new>
中,如果想在一块已经获得的内存里建立一个对象,那就应该用 placement new。
placement new 适用于:在对时间要求非常高的应用程序中,因为这些程序分配的时间是确定的;长时间运行而不被打断的程序;以及执行一个垃圾收集器。
Placement new 使用步骤
char * buff = new [sizeof(Task)];
char buf[N*sizeof(Task)];
void* buf = reinterpret_cast<void*> (0xF00F);
Task *ptask = new (buf) Task
。ptask->memberfunction();
.ptask->~Task();
delete [] buf
; char* ptr = new char[sizeof(T)]; //@ allocate memory
T* tptr = new(ptr) T; //@ construct in allocated storage ("place")
tptr->~T(); //@ destruct
delete[] ptr; //@ deallocate memory
标签:自动调用 使用步骤 out 程序 des 库函数 垃圾 cto 否则
原文地址:https://www.cnblogs.com/xiaojianliu/p/14756784.html