malloc

malloc,第1张

malloc malloc/free和new/delete
  • malloc 与free 是C++/C 语言的标准库函数,new/delete 是C++的运算符。它们都可用于申请动态内存和释放内存。
  • 对于非内部数据类型的对象而言,光用 maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象在消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
  • 因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete 不是库函数。
class obj
{
	public:
		obj(void){cout << "Init" << endl;}
		~obj(void){cout << "Destory" << endl;}
		void Init(void){cout << "Init" << endl;}
		void Destory(void){cout << "Destory" << endl;}
}

void UseMallocFree(void)
{
	obj *a = (obj*)malloc(sizeof(obj);
	a->Init();
	
	a->Destory();
	free(a);
}

void UseNewDelete(void)
{
	obj *a = new obj;
	
	delete a;
}
  • Obj 的函数Initialize 模拟了构造函数的功能,函数Destroy 模拟了析构函数的功能。
  • 函数UseMallocFree 中,由于malloc/free 不能执行构造函数与析构函数,,必须调用成员函数Init和Destory来完成初始化与清除工作。
  • 函数UseNewDelete 则简单得多
malloc/free使用 malloc的函数原型
void * malloc(size_t size);
  • malloc 返回值的类型是void *,所以在调用malloc 时要显式地进行类型转换,将void * 转换成所需要的指针类型。
free的函数原型
void free( void * memblock );
  • 如果p 是NULL 指针,那么free 对p 无论 *** 作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续 *** 作两次就会导致程序运行错误。
new/free使用
  • 如果对象有多个构造函数,那么new 的语句也可以有多种形式

    class obj
    {
    	obj(void);
    	obj(int x);
    	...
    }
    
    void Test(void)
    {
        obj *a = new obj;
        obj *b = new obj(41);
        
        delete a;
        delete b;
    }
    
  • 如果用new 创建对象数组,那么只能使用对象的无参数构造函数。

    //正确表达
    Obj *objects = new Obj[100]; // 创建100 个动态对象
    //错误表达
    Obj *objects = new Obj[100](1);// 创建100 个动态对象的同时赋初值1
    
    //正确释放
    delete []objects;
    //错误释放
    delete objects;//相当于delete objects[0],漏掉了另外99 个对象。
    

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5650351.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存