栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

malloc

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 个对象。
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/648155.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号