c++内存管理方式
c语言内存管理方式在c++中可以继续使用,但有些地方就无能为力而且使用起来特别麻烦,因此c++又提出了自己的内存管理方式:通过new和delete来对内存进行操作。
void Test()
{
int *ptr4 = new int;
//动态申请一个int类型的空间
int *ptr5 = new int(10);
//动态申请一个空间并初始化为10
int *ptr6 = new int[10];
//动态申请10个int类型的空间
delete ptr4,ptr5;
delete ptr6[];
}
注意:申请和释放单个空间使用new和delete,申请和释放连续空间使用new[]、delete[]
new和delete操作自定义类型
#include <iostream>
using namespace std;
class Test
{
public:
Test():_data(0)
{
cout<<"Test()"<<endl;
}
~Test()
{
cout<<"~Test"<<endl;
}
private:
int _data;
};
void Test1()
{
Test* t1 = (Test*)malloc(sizeof(Test));
free(t1);//申请单个Test类型空间
Test* t2 = (Test*)malloc(sizeof(Test)*10);
free(t2);//申请10个test空间
}
void Test2()
{
Test* t1 = new Test;
delete t1;
Test* t2 = new Test[10];
delete []t2;
}
int main()
{
Test1();
Test2();
return 0;
}
运行上述代码后,会发现:在申请自定义类型的空间时,new和delete会分别调用构造函数和析构函数,而malloc和delete则不会。
new和delete的实现原理
对内置类型来说:new、delete和malloc、free基本类似,不同是:new和delete申请和释放的是单个元素的空间,new【】和delete【】申请的是连续的空间而且new失败后会抛异常,而malloc失败会返回NULL。
对自定义类型:
new:1、调用operator new函数申请空间
2、在申请空间上面进行构造函数,完成对对象的构造
delete:1、在空间上执行析构函数,完成对资源的统一清理
2、调用operator delete释放申请空间
内存泄漏
内存泄漏:内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
内存泄漏危害:不仅影响到服务器的性能,还可能造成整个系统的崩溃。