malloc/free 与 new/delete区别
- C语言中的malloc和free是库函数;而C++中的new和delete是运算符,不是函数,所以运行效率更高。
- new类对象的时候会调用构造函数,delete类对象的时候会调用析构函数;而malloc和free并不会调用构造函数和析构函数,所以在分配类对象的时候应使用new搭配delete,这样在释放堆上申请的空间时,还能调用析构函数析构对象成员占用的资源。
new/delete分配基础数据类型、数组、类对象详解
代码如下:
#include <iostream> using namespace std; class MyClassA { public: MyClassA() { cout << "无参构造函数调用" << endl; } MyClassA(int a) { this->a = a; cout << "有参构造函数调用" << endl; } ~MyClassA() { cout << "析构函数调用" << endl; } public: void SetA(int a) { this->a = a; } void PrintA() { cout << "a = " << a << endl; } private: int a; }; //使用new和delete分配基本数据类型 void FuncTest1() { //malloc free 库函数 int* a = (int*)malloc(sizeof(int) * 1); *a = 6; cout << *a << endl; free(a); //new delete 运算符 int* b = new int; *b = 6; cout << *b << endl; delete b; //new的同时初始化 int* c = new int(6); cout << *c << endl; delete c; } //new delete 分配数组 void FuncTest2() { char* a = (char*)malloc(sizeof(char) * 6); *a = 'a'; cout << a[0] << endl; free(a); char* b = new char[6]; *b = 'b'; cout << b[0] << endl; delete[] b; } //分配类对象 void FuncTest3() { MyClassA* a = (MyClassA*)malloc(sizeof(MyClassA)); a->SetA(7); (*a).PrintA(); free(a); MyClassA* b = new MyClassA; //调用无参构造函数 b->SetA(8); b->PrintA(); delete b; //调用析构函数 MyClassA* c = new MyClassA(5); //调用有参构造函数 c->PrintA(); delete c; //调用析构函数 } //混搭使用 void FuncTest4() { MyClassA* a = (MyClassA*)malloc(sizeof(MyClassA)); //不会调用无参构造函数 a->SetA(7); (*a).PrintA(); delete a; //调用析构函数 MyClassA* b = new MyClassA; //调用无参构造函数 b->SetA(8); b->PrintA(); free(b); //不会调用析构函数 } int main() { FuncTest1(); FuncTest2(); FuncTest3(); FuncTest4(); std::cout << "Hello World!\n"; system("pause"); return 0; }
系列文章
三、【类中的静态成员】静态成员变量与静态成员函数(static关键字、this指针)