C++内存管理(复习)
1.动态申请多个某类型的空间并初始化
//动态申请10个int类型的空间并初始化为0到9
int* p = new int[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
delete[] p; //销毁
2.new/delete
new:开空间+构造函数
delete:析构函数+释放空间
new和delete是用户进行动态内存申请和释放的操作符,operator new和operator delete是系统提供的全局函数,new和delete在底层是通过调用全局函数operator new和operator delete来申请和释放空间的。
3.malloc/free和new/delete的区别
共同点:
都是从堆上申请空间,并且需要用户手动释放。
不同点:1、malloc和free是函数,new和delete是操作符。
2、malloc申请的空间不会初始化,new申请的空间会初始化。
3、malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可。
4、malloc的返回值是void*,在使用时必须强转,new不需要,因为new后跟的是空间的类型。
5、malloc申请失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常。
6、申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数和析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理。
4.RALL思想
RAII 思想的核心是将资源的获取和对象的初始化绑定在一起,资源的释放和对象的析构绑定在一起。当一个对象被创建时,它会负责获取所需的资源;当对象的生命周期结束(例如离开作用域)时,它的析构函数会自动被调用,从而释放所占用的资源。
5.内存泄漏
内存泄漏是指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。