深度剖析malloc、free和new、delete
1、malloc,free是C语言的函数,而new,delete是操作符,属于C++的语法,一定注意这两个不再是函数了,而是操作符。
2、malloc和new对于分配基础类型变量和数组变量,它们除了语法上有些区别,比如
demo
////分配基础类型 int main() { // int *p = (int *)malloc(sizeof(int)); *p = 10; //free(p); delete p; int *p2 = new int; //分配基础类型 *p2 = 20; free(p2); // int *p3 = new int(30); printf("*p3:%d \n", *p3); //delete p3; free(p3); return 0; }
//分配数组变量 int main() { //c语言分配数组 int *p = (int *)malloc(sizeof(int) * 10); //int array[10]; p[0] = 1; //free(p); delete[] p; //c++分配数组 int *pArray = new int[10] ; pArray[1] = 2; //delete [] pArray; //数组不要把[] 忘记 free(pArray); char *pArray2 = new char[25] ; //char buf[25] delete [] pArray2; return 0; }3、除了语法的区别,他们实际的作用没有什么不同,而且用malloc分配的可以用delete释放,new分配的也可以用free释放。但是对于类对象的分配,它们的区别比较明显
demo
class Test { public: Test(int _a) { a = _a; cout<<"构造函数执行" <<endl; } ~Test() { cout<<"析构函数执行" <<endl; } protected: private: int a; }; //分配对象 new delete //相同和不同,new能执行类型构造函数,delete操作符,能执行类的析构函数 int main() { //c Test *pT1 = (Test *)malloc(sizeof(Test)); //free(pT1); delete pT1; //c++ Test *pT2 = new Test(10); //delete pT2; free(pT2); <span style="white-space:pre"> </span>return 0; }
用new和delete时,会分别调用类的构造函数和析构函数,而此时malloc和free就无力了。