现在的位置: 首页 > 综合 > 正文

new和malloc的区别和联系

2013年03月01日 ⁄ 综合 ⁄ 共 3003字 ⁄ 字号 评论关闭

面试和笔试 经常问到 new 和c++问题。网上找了一下觉得这篇讲解不错转过来了。
1、new 是c++中的操作符,malloc是c 中的一个函数

2、new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数

3、内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。

4、new 和 malloc效率比较

new 有三个字母, malloc有六个字母

new可以认为是malloc加构造函数的执行。

new出来的指针是直接带类型信息的。

而malloc返回的都是void指针。

一:new delete 是运算符,malloc,free是函数

malloc与free是C++/C语言的标准库函数new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。

因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

我们先看一看malloc/free和new/delete如何实现对象的动态内存管理,见示例。

#include <iostream>
using namespace std;

class Obj
{

public :

	Obj(void){ cout << "new Initialization" << endl; }

	~Obj(void){ cout << "delete Destroy" << endl; }

	void  Initialize(void){ cout << "malloc Initialization" << endl; }

	void  Destroy(void){ cout << "free Destroy" << endl; }

};


void UseMallocFree(void)

{
      Obj    *a = (Obj *)malloc(sizeof(Obj));     // 申请动态内存

      a->Initialize();                          // 初始化

      //…

      a->Destroy();     // 清除工作

      free(a);          // 释放内存
}

void UseNewDelete(void)

{

      Obj    *a = new Obj;    // 申请动态内存并且初始化

      //…

      delete a;             // 清除并且释放内存

}

int main(){
	UseMallocFree();
	UseNewDelete();
	return 0;
}

程序运行结果:

malloc Initialization
free Destroy
new Initialization
delete Destroy
Press any key to continue

示例用malloc/free和new/delete如何实现对象的动态内存管理

类Obj的函数Initialize模拟了构造函数的功能,函数Destroy模拟了析构函数的功能。函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作。函数UseNewDelete则简单得多。

所以我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。

既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C(没有对象)程序只能用malloc/free管理动态内存

如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。

二:new delete在实现上其实调用了malloc,free函数。

三:new operator除了分配内存,还要调用构造函数。

malloc函数只是负责分配内存。
转自:http://liuzhen0107.blog.163.com/blog/static/2245835220107331254141/
另外:
从malloc 函数声明看:
extern void * malloc(unsigned int num_bytes); 
头文件:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 与 malloc.h 的内容是完全一致的。)
功能:分配长度为num_bytes字节的内存块
说明:1)如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL
          2)malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。 
 从函数声明上可以看出。malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。
比如: 
  int *p; 
  p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int); 
  或: 
  int* parr; 
  parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100; 
  而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针。 
  int* p; 
  p = (int *) malloc (sizeof(int)); 
  第一、malloc 函数返回的是 void * 类型,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *)
来将强制转换。 
第二、函数的实参
sizeof(int) ,用于指明一个整型数据需要的大小。如果你写成: 
  int* p = (int *) malloc (1); 
  代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里头存入一个整数,就会有3个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容全部被清空。 
  malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小。 
  比如想分配100个int类型的空间: 
  int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。 
  另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。 
  除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。

抱歉!评论已关闭.