前言

类的几个基本点差不多了,后续还有重载多态…


正文

当然不是配套就行,还要知道为什么配套。


malloc和new

对于基本数据类型,malloc和new没啥区别。
但是对于类而言,malloc是仅分配内存,而new除了分配内存还会调用它的构造函数。

1
2
3
4
5
6
7
8
9
10
11
12
class Box{
int count;
static int s_count;
public:
Box(){
std::cout << "第" << ++s_count << "个构造函数" << std::endl;
}

~Box(){
std::cout << "析构函数" << std::endl;
}
};

然后malloc分配看看会不会调用构造函数Box *b1 = (Box *)malloc(sizeof(Box) * 10);

看到什么都没有发生。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Box{
int count;
static int s_count;
public:
Box(){
std::cout << "第" << ++s_count << "个构造函数" << std::endl;
}

int x = 1;

~Box(){
std::cout << "析构函数" << std::endl;
}
};

在类中加一个成员变量。

打印测试:
看到是值不正常。这其实就是因为malloc不适合类,它只是做了无脑的内存分配。

在做new之前,先将项目属性的标准调到c++17,因为static静态的一开始没法初始化,自增的时候有点问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>

class Box{
int count;
inline static int s_count = 0;
public:
Box(){
std::cout << "第" << ++s_count << "个构造函数" << std::endl;
}

int x = 1;

~Box(){
std::cout << "析构函数" << std::endl;
}
};

所以把它声明成内联的,做一个初始化定义。
然后new十个看看先:
发现调用了构造函数。
然后它也可以访问成员变量x


free和delete

用free去释放new的内存空间本身问题也不大,但是对于类,如果设置了析构函数就会

正常释放一个new的空间用delete自然会调用析构函数

所以说malloc和free不适合类,只适合基本数据类型。
而new和delete才适合类,前者能调用构造函数,后者能调用析构函数。


delete和delete[]

delete是释放单个new的元素,delete[]自然就是释放一片连续的内存,而且会挨个调用析构函数

1
2
Box *b2 = new Box[10];
delete[] b2;

结语

所以当动态分配对象只是普通数据类型,那么malloc/free 或者 new/delete问题倒不是很大。
但是如果对象是类,就只能使用new/delete。因为new会调用构造函数。