一、c++中动态内存管理方法
(1)动态内存分配new
c++中使用new
动态分配内存,其用法和malloc
相似
Type* a = new Type(x);
new
运算符在使用上比malloc
更加便捷,并且与malloc
相比,它不光能动态分配内存,而且会对所分配的内存进行初始化,new分配连续空间方法如下:
Type a[] = new Type[x];
上述代码意思是分配x个Type大小的空间。
(2)释放内存delete
delete
完成的工作也和free
差不多,用于释放new
分配的空间,需要注意的是,其释放单个空间和free
基本相同,delete a
,但是释放连续空间时需要加上方括号:
delete []a;
如果不加方括号对于普通类型来说就相当于调用free
,没什么大碍,只是不建议这么做,但是对于自定义类型,不加方括号就是只释放一个单位的空间,会造成内存泄漏。
二、new-malloc,delete-free的对比
从根本意义上来说,new
和delete
是运算符,而malloc
和free
是库函数。
malloc
和free
只是负责内存的分配和释放,而new
和delete
不光是进行内存分配与释放,而且会对所分配内存初始化或对所释放内存析构,也就是说,类型为内置类型时,new
会调用构造函数,delete
会调用析构函数,另外,new
和delete
会进行安全检查,分配失败或者释放内存为空会抛出异常。
new
和delete
还是用malloc
和free
来实现的,只不过调用了构造函数和析构函数以及一些其他必要的东西。new和delete在类型为自定义类型时会调用operator new
和operator delete
,其底层实现还是会调用malloc和free。
三、定位new的使用
有时候需要对已经分配的内存进行重新定义或者说初始化工作,这时候就要用到定位new,其用法如下:
new(指针)Type(初始化列表)
乍一看这种写法有点奇怪,但是如果没有指出地址,也就是说没有new后边那个括号,这个语句就和普通的new的用法一模一样,所以可以说这种用法只是在调用new的一个重载版本而已,我们也可以自己实现new的重载。