- 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 则简单得多
void * malloc(size_t size);
- malloc 返回值的类型是void *,所以在调用malloc 时要显式地进行类型转换,将void * 转换成所需要的指针类型。
void free( void * memblock );
- 如果p 是NULL 指针,那么free 对p 无论 *** 作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续 *** 作两次就会导致程序运行错误。
-
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 个对象。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)