携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情
C++中的内存管理
C++中有一个令人感觉矛盾的存在,就是内存管理。如果内存管理得当,那么C++的优势就可以发挥地淋漓尽致:没有垃圾回收机制,使得很多冗余的操作都不再需要;当然,如果内存管理不当,那么C++将是菜鸟的地狱:无穷无尽的segment fault会像梦魇一样围绕着你,让你异常抓狂。
C++中分配内存的方式有标准C中的malloc和C++标准库中的new,其中malloc是个函数,new则是个关键字,他们返回的都是指针,不同的是,malloc函数返回的是void*类型的指针,所以需要将指针进行C风格的显式强制类型转换,或者是C++风格的基于模板的static_cast,而new因为后面会跟具体的数据类型,所以返回的就是直接可以使用的指针;释放内存的方式有标准C中的free和C++标准库中的delete,其中free是个函数,delete则是个关键字,free函数的入参就是指向所要释放内存空间的指针,delete也是一个关键字,它可以操作指针,也可以使用delete[]来操作数组,作用是将数组中的每个元素都依次执行delete。
new和delete由于是C++提供的关键字,自然会关联到C++中面向对象的相关概念,比如说“类”。在有“类”这个概念参与其中时,C++的new可以拆分为两步:先是根据类的大小调用malloc申请一块内存地址空间,再调用类的构造函数创建一个类的实例(也就是一个“对象”)。而delete的内部实现步骤则刚好相反:先是调用类的析构函数,然后再调用free函数,释放掉类实例所占用的内存空间。