一.new和delete介绍
- 在C语言中使用malloc和free来分配和释放内存空间。
- 在C++中提供了更简单且功能强大的运算符new和delete来取代malloc和free函数。
- new和delete是运算符,不是函数,因此执行效率高。
- 在C++中建议使用new和delete。
二.malloc和free使用
//申请空间
int* a = (int*)malloc(sizeof(int));
//申请10个int空间
int* b = (int*)malloc(sizeof(int)*10);
//赋值
*a = 10;
//释放空间
if (a == nullptr) {
free(a);//释放空间
a = nullptr;
}
三.new和delete使用
//申请空间
int* a = new int;
int* b = new int(10);//开辟一个int型大小变量,且初始化值为10;等价于b=10.
int* c = new int[10];//开辟数组,可以输入10个int数据;等价于c[10];
//赋值
*a = 10;
//释放空间
if (a == nullptr) {
delete a;//释放空间
a = nullptr;
}
if (c == nullptr) {
delete[] c;//释放空间
a = nullptr;
}
四.malloc、free和new、delete区别
例子:使用malloc开辟class空间。
class text {
private:
int m_a;
int m_b;
public:
text(int a, int b) {
cout << "text(int a, int b)......" << endl;
m_a = a;
m_b = b;
}
void print() {
cout << "m_a"<<m_a<<",m_b"<<m_b << endl;
}
~text() {
cout << "~text()......" << endl;
}
};
int main(int argc, char** argv) {
//用malloc实现
text* t1 = (text*)malloc(sizeof(text));
t1->print();
//会发现,使用malloc没有办法调用构造函数
if (t1 != nullptr) {
free(t1);
t1 = nullptr;
}
}
会发现:
- 使用malloc函数,没有办法调用构造函数进行初始化。
- 使用free()不会触发析构函数。
结果:
例子:使用new开辟class空间
//用new实现
text* t2 = new text(1, 2);//调用有参构造函数
t2->print();
if (t2 != nullptr) {
delete t2;
t2 = nullptr;
}
会发现:
- 使用new可以在初始化时候调用有参构造函数。
- 使用delete会触发析构函数。
结果: