内存管理c/c++
new delete
new和delete是c++两个关键字,负责开辟动态空间和销毁空间,和malloc和free很像。但是两者还是有区别的,祖师爷也是觉得c语言开辟堆空间的方式太麻烦。于是,把他们封装成了函数,分别由new和delete调用,也就是说,new和delete的底层原理还是调用malloc和free。对于内置类型来说,new和delete可能没什么太大作用。最多就是简化了一下代码。但是如果是对象的动态开辟就有很大区别了。因为对象的创建是必须要初始化的,但是malloc不会初始化。对于对象创建,我们需要先开辟空间,再调用构造函数;对于对象销毁,我们需要先调用析构函数,再free空间。而把他们两个封装成函数的函数就是,operator new 和operator delete 。
定位new
定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象
使用格式:
- new (place_address) type或者new (place_address) type(initializer-list)
- place_address必须是一个指针,initializer-list是类型的初始化列表
定位new对于c++初期了解就可以了,它的使用并不是很广。一般会配合内存池使用,提高效率。虽然这种需求比较少,但是确实有这种场景。所以,他的存在还是有道理的。
malloc/free与new/delete区别
从本质看:malloc/free是函数 ,而new/delete是操作符。这个和sizeof和strlen是一样的。
从用法功能看:
- mallloc开辟失败会直接返回空指针,而new基于对象的特性会抛出异常,这是对象和过程的一个区别。
- malloc开辟空间需要手动计算大小,而new只需要指定类型和个数即可,推算出大小。
- malloc返回值是void*,需要强转。而new不需要,他后面直接跟着类型
从底层看:free会直接释放掉空间。而delete不仅仅会释放掉空间,还会调用析构函数。new和malloc的区别也是在这里,new会先开辟空间,再调用构造函数,而malloc只是单纯的开辟空间。其实new和free与malloc/free的区别明显是基于对象的。因为对象的创建必须初始化,在生命周期结束的时候需要自动调用析构函数。而c语言的malloc/free是完成不了的。
内存泄漏
内存泄漏这个问题对于普通程序的没有什么大问题。这和我们普通程序使用时间是短期和虚拟进程地址有关。实际上你写的程序是不会真正的占用物理内存的。要不然,你随便写个程序就把你的电脑弄崩溃了。那这怎么可能?我们的编译器没有这么傻的。
对于服务器上的程序,长期运行的。比如王者服务器上的程序,你可想象一下,你无论在什么时候打开游戏都是可以正常运行的。除了他规定的更行时间。如果,王者的服务器上的程序出现了一个内存泄漏的代码。而且还是一次泄露1MB,刚开始你还发现不了,那这多恐怖。不知道哪天你的程序就崩了。数据全泄露没了。你的游戏记录,充值的点券都没了。你想想,这是什么局面?
所以,我们平常写程序,尤其检查动态开辟的空间,记得释放。