目录
C++内存管理方式
C语言中内存管理几个常用函数是malloc、calloc、realloc和free。它们是用来在堆上开辟销毁空间的。C++作为C语言的发展,也支持malloc等这些函数,但是因为malloc、free是函数不是运算符,不在编译器控制权限之内,不能将调用构造、析构函数的任务强加给它们,因此,C++需要一个能同时完成动态内存分配和初始化工作的运算符new,以及完成清理与释放内存工作的运算符delete。
new/delete操作内置类型
在对内置类型的操作上,new/delete 与 malloc/free 几乎没有区别,只是new的写法较之malloc要简单许多:
int main()
{
int* a = new int;
delete a;
return 0;
}
但是注意:C++的运算符new不会自动初始化:
因此要初始化需要手动添加内容:
动态开辟数组:
同样不会初始化,也需要手动,用{ }
相比于malloc,又要计算开辟字节大小,又要强制类型转化,new还是比较方便的。
new/delete操作自定义类型
对于内置类型,malloc与new几乎一样,但是对于自定义类型就有很大差别了。
new开辟空间后调用自定义类的构造函数完成初始化,delete会调用析构函数完成数据清理,然后释放空间。
class A
{
public:
A(int a = 1)
:_a(a)
{
cout << "A():" << endl;
}
~A()
{
cout << "~A()" << endl;
}
private:
int _a;
};
int main()
{
A* d = new A(1);
delete d;
return 0;
}
有一点一定要注意:new和delete,malloc和free,一定要匹配!!不要互相之间混用。
还有new [ ]、delete [ ] ,new、delete也要匹配!!不要出现申请数组,释放却只释放第一个指针的情况,这样很容易出问题。
以上面的A类为例,看看不匹配会怎么样
int main()
{
A* d = new A[10];
delete d;
return 0;
}