《C++ Primer (第五版)》19.1章节
《c++程序设计语言 第四版》11.2.3 & 11.2.4
new 和delete操作的实现位于<new>头文件中。
当使用new / new[]时,做了三件事:
1、new表达式调用了operator new / operator new[]标准库函数,该函数分配内存空间用来储存对象,这时候得到的无类型且未初始化的内存,返回值类型:void*;
2、编译器调用构造函数构造对象
3、对象储存到分配的空间
当使用delete / delete[]时,做了两件事:
1、执行析构函数
2、编译器调用operator delete / operator delete[]标准库函数释放内存
重载new和delete就是重写这两个函数代替标准库中的函数,根据一般的作用域规则,类自身的operator new() 和operator delete() 优先级高于<new>中的函数。
static void * operator new(size_t size)
{
qDebug()<<"重载new";
if(void * mem = malloc(size))
return mem;
else
throw std::bad_alloc();
}
static void operator delete(void * mem)noexcept //noexcept不抛出异常
{
qDebug()<<"重载delete";
free(mem);
}
这两个函数是静态的,且不能操作数据成员(静态的数据也不行)。