标签:adl sha 初始 tor 没有 数据类型 span 构造 std
new 和 delete 是 C++ 用于管理 堆内存 的两个运算符,对应于 C 语言中的 malloc 和 free,但是 malloc 和 free 是函数,new 和 delete 是运算符。除此之外,
new 在申请内存的同时,还会调用对象的构造函数,而 malloc 只会申请内存;
delete 在释放内存之前,会调用对象的析构函数,而 free 只会释放内存。
new 运算符的内部实现分为两步:
内存分配
调用相应的 operator new(size_t)
函数,动态分配内存。如果 operator new(size_t)
不能成功获得内存,则调用 new_handler()
函数用于处理new失败问题。如果没有设置 new_handler()
函数或者 new_handler()
未能分配足够内存,则抛出 std::bad_alloc
异常。“new运算符”所调用的 operator new(size_t)
函数,按照C++的名字查找规则,首先做依赖于实参的名字查找(即ADL规则),在要申请内存的数据类型T的 内部(成员函数)、数据类型T定义处的命名空间查找;如果没有查找到,则直接调用全局的 ::operator new(size_t)
函数。
构造函数
在分配到的动态内存块上 初始化 相应类型的对象(构造函数)并返回其首地址。如果调用构造函数初始化对象时抛出异常,则自动调用 operator delete(void*, void*)
函数释放已经分配到的内存。
delete 运算符的内部实现分为两步:
析构函数
调用相应类型的析构函数,处理类内部可能涉及的资源释放。
内存释放
调用相应的 operator delete(void *)
函数。调用顺序参考上述 operator new(size_t)
函数(ADL规则)。
class T{ public: T(){ cout << "构造函数。" << endl; } ~T(){ cout << "析构函数。" << endl; } void * operator new(size_t sz){ T * t = (T*)malloc(sizeof(T)); cout << "内存分配。" << endl; return t; } void operator delete(void *p){ free(p); cout << "内存释放。" << endl; return; } }; int main() { T * t = new T(); // 先 内存分配 ,再 构造函数 delete t; // 先 析构函数, 再 内存释放 return 0; }
注意:
free只能释放基础类型的内存资源;
delete在free功能的基础上,增加了对类资源内存空间的处理。
标签:adl sha 初始 tor 没有 数据类型 span 构造 std
原文地址:https://www.cnblogs.com/cthon/p/9175657.html