贵阳好的网站建设公司,网络营销期末总结,网站服务器 同步备份,电商网站域名文章目录1、动态内存管理2、内存管理方式operator new operator delete3、new和delete的实现原理1、动态内存管理
C兼容C语言关于内存分配的语法#xff0c;而添加了C独有的东西。 //int* p1 (int*)malloc(sizeof(int));int* p1 new int;new是一个操作符#xff0c;C不再需…
文章目录1、动态内存管理2、内存管理方式operator new operator delete3、new和delete的实现原理1、动态内存管理
C兼容C语言关于内存分配的语法而添加了C独有的东西。 //int* p1 (int*)malloc(sizeof(int));int* p1 new int;new是一个操作符C不再需要强转类型。如果要开辟多个 //int* p2 (int*)malloc(sizeof(int) * 7);int* p2 new int[7];这个new不只是C的动态开辟方式还有独特的点。同malloc一样new没有初始化但它对于自定义类型的处理要更好。C的free就是delete。 //int* p1 (int*)malloc(sizeof(int));int* p1 new int; //int* p2 (int*)malloc(sizeof(int) * 7);int* p2 new int[7];delete p1;delete[] p2;写一个类
class A
{
public:A(int a 0):_a(a){cout 构造 this endl;}~A(){cout 销毁 this endl;}
private:int _a;
};A* pp3 (A*)malloc(sizeof(A));free(pp3);A* p3 new A(1);delete p3;
malloc只是开空间free只是释放空间而new会调用构造函数和析构函数。 2、内存管理方式
new也可以初始化 int* p1 new int(10);int* p2 new int[10];int* p3 new int[10] {1, 2, 3, 4};一个是初始化一个变量一个是初始化一个数组总共10个元素第三个则是指定初始化这里初始化了4个元素。
但不能交叉使用用mallocdelete系统会抽查错误查到编译器就会出现奇怪的错误。
operator new operator delete
operator new 和operator delete是 系统提供的全局函数new在底层调用operator new全局函数来申请空间delete在底层通过operator delete全局函数来释放空间。
实际上它们不是new 和 delete的重载函数。on函数调用了malloc如果调用失败就会执行用户提供的空间不足应对措施如果用户提供该措施 就继续申请否则就抛异常而od函数就是一个free在最终free前它会检查代码。
所以实际上它们就是malloc和free的封装。 int* p1 (int*)operator new(sizeof(int));int* p2 (int*)malloc(sizeof(int));malloc失败时会返回空而on会返回异常。
3、new和delete的实现原理
对于内置类型new和malloc无区别但对自定义类型有区别。new[]和delete[]实现的是连续空间的操作。
new的逻辑是先调用operator new再malloc再调用构造函数。delete的逻辑是先调用析构函数再调用operator delete也就是相当于free。
new/delete 和 malloc/free有不同的实现机制尽量不交叉使用以免出现不可控的错误。
new T[N]的原理
调用operator new[]函数在operator new[]中实际调用operator new函数完成N个对 象空间的申请在申请的空间上执行N次构造函数
delete[]的原理 4. 在释放的对象空间上执行N次析构函数完成N个对象中资源的清理 5. 调用operator delete[]释放空间实际在operator delete[]中调用operator delete来释 放空间
new一个数组编译器内部会多开四个字节的空间来存储元素个数这是在手动写了析构函数的情况下如果是自动析构函数那么编译器就会评估一下是否需要这四个字节比如类里没有对资源进行管理那么就不需要析构函数也就不会多开4个字节。 malloc/free和new/delete的共同点是都是从堆上申请空间并且需要用户手动释放。不同的地 方是 malloc和free是函数new和delete是操作符malloc申请的空间不会初始化new可以初始化malloc申请空间时需要手动计算空间大小并传递new只需在其后跟上空间的类型即可 如果是多个对象[]中指定对象个数即可malloc的返回值为void*, 在使用时必须强转new不需要因为new后跟的是空间的类型malloc申请空间失败时返回的是NULL因此使用时必须判空new不需要但是new需 要捕获异常申请自定义类型对象时malloc/free只会开辟空间不会调用构造函数与析构函数而new 在申请空间后会调用构造函数完成对象的初始化delete在释放空间前会调用析构函数完成 空间中资源的清理 结束。