[C++再学习系列] 深入new/delete:类域的operator new重载
2012-11-13 19:11
495 查看
类域的 operator new 重载
为 class 重载 operator new 时必须定义为类的静态函数 ( 默认为 static 函数 ) 。重载 operator new 更多的是为了提高程序效率,比如使用静态内存代替动态分配,启用小对象分配器等。但是要正确重载类域的 operator new 并不容易,有很多规则需要注意: 1) 总是成对提供 new/delete ; 2) 如重载 operator new 一定要同时提供标准形式的 new 。举例:
class T {
static void* operator new(std::size_t);
static void* operator new(std::size_t, CustomAllocator&);
static void operator delete(void*, std::size_t);
};
T* p = new(alloc) T;
上述代码将被编译器展成下述代码 ( 猜测,如果有高人知道如何查看编译器生成的中间代码,烦请告知。 )
// compiler-generated code for T* p = new(alloc) T;
//
void* __compilerTemp = T::operator new (sizeof(T), alloc); // 1
T* p;
try {
p = new (__compilerTemp) T; // 2 // construct a T at address __compilerTemp
}
catch(...) { // constructor failed, attention here…
T::operator delete (__compilerTemp, sizeof(T), alloc); // 3
throw;
}
注释 1 : operator new 用于分配内存, new 的第一步骤;
注释 2 : placement new 用于在于地址上构建对象,也就是调用 T 的构造函数。
注释 3 :与 operator new 配套的 operator delete 。
C++ 标准规定:当且仅当 operator delete 的重载存在时,以上代码才能生成。否则,在构造函数失败的情况下,代码不会调用 operator delete 。也就是说,如果构造函数抛异常,内存将泄漏。
这意味着:当提供 void* operator new(parms) 重载时,必须同时提供 void operator delete(void*, parms), 这里参数列表的第一个参数总为 std::size_t 。 对于 operator new[] 也是如此。例外,对于 placement new 由于并不实际分配内存,可不重载相应的 operator delete 。
相关文章推荐
- [C++再学习系列] 深入new/delete:类域的operator new重载
- [C++再学习系列] 深入new/delete:类域的operator new重载
- [C++再学习系列] 深入new/delete:Operator new的全局重载 -转载
- [C++再学习系列] 深入new/delete:Operator new的全局重载
- [C++再学习系列] 深入new/delete:New的3种形态
- [C++再学习系列] 深入new/delete:Operator new的全局重载
- [C++再学习系列] 深入new/delete:New的3种形态
- [C++再学习系列] 深入new/delete:New的3种形态
- [C++再学习系列] 深入new/delete:Operator new的全局重载
- 【C++】学习小笔记系列-1-new和delete的实际过程。
- 深入浅析C++的new和delete
- C++ 中的 new/delete 和 new[]/delete[]深入理解
- C++基础知识学习:new与delete表达式
- 改善C++ 程序的150个建议学习之建议33:小心翼翼地重载operator new/ operator delete
- C++ 学习笔记(12)动态内存、智能指针、new和delete、动态数组、allocator
- C++学习笔记:New和Delete
- C++学习笔记之1:使用相同形式的new和delete
- 《More Effective C++》学习心得(六)各种new和delete操作符
- C++中new与delete问题学习
- C++学习笔记---new/delete