• 深度剖析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 
    ", *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就无力了。


  • 相关阅读:
    C# SendKeys用法
    Winform的高DPI问题
    CefSharp在高DPI的屏幕上出现黑边(winform)
    CefSharp支持flash
    CeSharp支持MP4
    C#加密解密总览
    Eclipse 调试Bug之使用断点的七大技巧
    详解Eclipse断点
    怎样编写高质量的java代码
    Quartz任务调度基本使用
  • 原文地址:https://www.cnblogs.com/zhangyaoqi/p/4591582.html
Copyright © 2020-2023  润新知