专业的网站优化,室内设计网上接单,珠海网站建设网,房地产交易网站摘要#xff1a;new and delete#xff0c;定位new#xff0c;#xff08;C内存管理的方式#xff09;#xff0c;malloc/free和new/delete的区别#xff0c;内存泄漏 关于内存#xff1a; 栈又叫堆栈——非静态局部变量/函数参数/返回值等等#xff0c;栈是向下增长…摘要new and delete定位newC内存管理的方式malloc/free和new/delete的区别内存泄漏 关于内存 栈又叫堆栈——非静态局部变量/函数参数/返回值等等栈是向下增长的。内存映射段是高效的I/O映射方式用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存做进程间通信。目前只需了解一下堆用于程序运行时动态内存分配堆是可以上增长的。数据段——存储全局数据和静态数据。代码段——可执行的代码/只读常量。 1. new/delete——C内存管理的方式
对于内置类型 对于自定义类型 使用示例 2. operator new与operator delete函数
ps.operator new与operator delete函数不是运算符重载函数 new 和 delete 是用户进行动态内存申请和释放的操作符operator new 和 operator delete 是系统提供的全局函数new 在底层调用 operator new全局函数来申请空间delete 在底层通过 operator delete全局函数来释放空间。 operator new 实际也是通过malloc来申请空间operator delete 最终是通过free来释放空间的 1开空间失败抛异常 operator new该函数实际通过malloc来申请空间当malloc申请空间成功时直接返回申请空间失败尝试执行空间不足应对措施如果该应对措施用户设置了则继续申请否则抛异常。 int main()
{try{int* p new int[0x7ffffffff];cout hello endl;//开空间失败该语句将不会被执行直接跳转}catch (const exception e){cout e.what() endl;}return 0;
} 2显式调用
Type* p (Type*)operator new(sizeof(Type));//Type* p new Type;operator delete(p);//delete p; 3new 和 delete 不匹配使用的问题
对于内置类型不匹配使用一般不会出什么问题对于自定义类型一定要匹配使用否则结果是未定义的 warning一定要匹配使用new Type[n] → delete[]new → deletemalloc → free。 3. 定位 new 定位new 表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。 class A
{
public:A(const int a):_a(a){}
private:int _a;
};int main()
{A* pst (A*)operator new(sizeof(A));//开空间但不初始化new(pst)A(0);//调用构造函数初始化pst-~A();//析构函数可以显式调用return 0;
}
使用new (place_address) type or new (place_address) type(initializer-list)
内存池
ps.构造函数不可以直接显式调用 定位new表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化所以如果是自定义类型的对象需要通过使用new的定义表达式调用构造函数进行初始化。 4. malloc/free和new/delete的区别
①malloc/free是函数new/delete是操作符②malloc的返回值为void*, 在使用时必须强转new不需要③malloc申请空间时需要手动计算空间大小并传递new只需在其后跟上空间的类型即可 如果是多个对象[]中指定对象个数即可④initializermalloc申请的空间不会 初始化 new可以初始化⑤failmalloc申请空间 失败 时返回的是NULL因此使用时必须判空new不需要但是new需 要捕获异常⑥call申请自定义类型对象时malloc/free只会开辟空间不会 调用 构造函数与析构函数而new 在申请空间后会调用构造函数完成对象的初始化delete在释放空间前会调用析构函数完成 空间中资源的清理 5. 内存泄漏 什么是内存泄漏内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失而是应用程序分配某段内存后因为设计错误失去了对该段内存的控制因而造成了内存的浪费。 普通程序内存泄漏问题不大进程结束会自动清理。但是对于长期运行的程序影响很大如操作系统、后台服务等等内存泄漏会导致响应越来越慢最终卡死。 END