11 关于C++中的new和delete(学自Boolean)
来源:互联网 发布:淘宝拍单软件 编辑:程序博客网 时间:2024/06/05 05:43
1、引言
本篇介绍new和delete的内存管理以及operator new/new[]和operator delete/delete[]的重载方法。
2、new的内存分配
注意点:
a、如上图构造一个复数对象,使用new方法,存放指针pc,编译器在构造过程中会分成三个步骤:①分配内存(使用operator new());②转型;③调用构成函数;
b、这个过程的简单理解就是先分配一块内存给声明对象,然后往对象中添加数据。
3、delete的内存管理
注意点:
a、如上图使用delete pc。编译器会转化为两个步骤:①调用析构函数;②释放内存(使用operator delete())。
b、这个过程简单的理解就是先清理数据,再释放指针。
4、关于new和delete的重载
1)头文件示例
class Foo{public:Foo() :_id(0){ cout << "default ctor.this = " << this << " id = " << _id << "\n";}Foo(int i) :_id(i){cout << "ctor.this = " << this << " id = " << _id << "\n";}~Foo(){cout << "dtor.this = " << this << " id = " << _id << "\n";}//重载方法static void* operator new(size_t size);static void operator delete(void* pdead, size_t size);static void* operator new[](size_t size);static void operator delete[](void* pdead, size_t size);private:int _id;long _data;};inlinevoid* Foo::operator new(size_t size){Foo* p = (Foo*)malloc(size);cout << "operator new(size_t size)" << endl;return p;}inlinevoid Foo::operator delete(void* pdead, size_t size){cout << "operator delete(void* pdead, size_t size)" << endl;free(pdead);}inline void* Foo::operator new[](size_t size){Foo* p = (Foo*)malloc(size);cout << "operator new[](size_t size)" << endl;return p;}inline void Foo::operator delete[](void* pdead, size_t size){cout << "operator delete[](void* pdead, size_t size)" << endl;free(pdead);}#endif2)主程序
int _tmain(int argc, _TCHAR* argv[]){Foo* f = new Foo; //#1delete f;//#2cout << "\n";Foo* f1 = new Foo[3]; //#3delete[] f1; //#4return 0;}/*输出结果:operator new(size_t size) //#1default ctor.this = 00D52C58 id = 0 //#1dtor.this = 00D52C58 id = 0 //#2operator delete(void* pdead, size_t size) //#2operator new[](size_t size) //#3default ctor.this = 00D51AF4 id = 0 //#3default ctor.this = 00D51AFC id = 0 //#3default ctor.this = 00D51B04 id = 0 //#3dtor.this = 00D51B04 id = 0 //#4dtor.this = 00D51AFC id = 0 //#4dtor.this = 00D51AF4 id = 0 //#4operator delete[](void* pdead, size_t size) //#4*/
注意点:
a、主程序中#1,构造单一对象f时,会重载operator new()方法(与前面描述new的内存管理中分配内存相关),然后调用构造函数;
b、主程序中#2,当delete f时,会先调用析构函数,然后调用operator delete;
c、主程序中#3,构造数组对象f1时,会重载operator new[]方法,然后调用构造函数(会根据数组个数依次调用);
d、主程序中#4,析构数组对象f1时,会先调用析构函数(会根据数组个数依次调用,顺序与构造函数调用相反),然后调用operator delete[]。
阅读全文
0 0
- 11 关于C++中的new和delete(学自Boolean)
- 关于C++中的new 和 delete
- 关于new和delete中的一些问题
- 08 C++11中的variadic template、auto和for基本用法(学自Boolean)
- 关于new和delete,new[] 和delete[]
- 关于new和delete,new[] 和delete[]
- 关于new和delete,new[] 和delete[]
- 关于new和delete
- 关于new和delete
- C++:new和delete
- new和delete【C++】
- C++ 中的 new/delete 和 new[]/delete[]
- C++中的new/delete和new[]/delete[]
- C++ 中的 new/delete 和 new[]/delete[]
- C++中的new delete和new[] delete []
- C++中的new/delete和new[]/delete[]
- C++ 中的 new/delete 和 new[]/delete[]
- 关于C++ 中的new 和 delete 操作符原理
- Android studio 常用的快捷键
- 测试经验与方法分享
- oracle条件参数中 IN函数中的值最大只能为1000个
- 滚动条
- JVM内存详解
- 11 关于C++中的new和delete(学自Boolean)
- Spring实战-读书笔记(章节三)-高级装配
- Android pm 命令详解
- 文件的复制
- 数据结构--二叉树遍历方法
- opencv split和merge操作
- iOS通过dSYM文件分析crash
- Android butterknife注入完毕后不起作用
- dubbo分布式服务框架