malloc和new
前言
类的几个基本点差不多了,后续还有重载多态…
正文
当然不是配套就行,还要知道为什么配套。
malloc和new
对于基本数据类型,malloc和new没啥区别。
但是对于类而言,malloc是仅分配内存,而new除了分配内存还会调用它的构造函数。
1 | class Box{ |
然后malloc分配看看会不会调用构造函数Box *b1 = (Box *)malloc(sizeof(Box) * 10);
看到什么都没有发生。
1 | class Box{ |
在类中加一个成员变量。
打印测试:
看到是值不正常。这其实就是因为malloc不适合类,它只是做了无脑的内存分配。
在做new之前,先将项目属性的标准调到c++17,因为static静态的一开始没法初始化,自增的时候有点问题
1 |
|
所以把它声明成内联的,做一个初始化定义。
然后new十个看看先:
发现调用了构造函数。
然后它也可以访问成员变量x
free和delete
用free去释放new的内存空间本身问题也不大,但是对于类,如果设置了析构函数就会
正常释放一个new的空间用delete自然会调用析构函数
所以说malloc和free不适合类,只适合基本数据类型。
而new和delete才适合类,前者能调用构造函数,后者能调用析构函数。
delete和delete[]
delete是释放单个new的元素,delete[]自然就是释放一片连续的内存,而且会挨个调用析构函数
1 | Box *b2 = new Box[10]; |
结语
所以当动态分配对象只是普通数据类型,那么malloc/free 或者 new/delete问题倒不是很大。
但是如果对象是类,就只能使用new/delete。因为new会调用构造函数。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Box'Blog!
评论