http://blog.csdn.net/miss_acha/article/details/7279915#comments

1.综述

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

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

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

4,C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存

new 是个操作符,和什么"+","-","="……有一样的地位。

malloc是个分配内存的函数,供你调用的。

new是保留字,不需要头文件支持。

malloc需要头文件库函数支持。

new 建立的是一个对象,

malloc分配的是一块内存。

new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间

malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针。

简而言之:

new 是一个操作符,可以重载

malloc是一个函数

new 初始化对象,调用对象的构造函数,对应的delete调用相应的析构函数

malloc仅仅分配内存,free仅仅回收内存

2.三种形式的new表达式

<1>单个对象的动态分配

int *pi = new int(11); // initializer

int *q = new int;   //assign

*q = i;

<2>数组的动态分配

int *pi = new int[11];   // 分配有11个元素的动态数组

int (*pia)[11] = new int [22][11];   //分配一个含有 22 * 11 个元素的二维数组

  • 动态分配的数组不能给出初始化值,一般在 for 循环中一个一个的初始化

for(int i = 0; i < 11; i++)

pi[i] = 0;

  • 动态数组的第一维不必是常量值, 这样就不必在编译时刻就知道维数,我们可以根据需要分配大小合适的内存单元
  • 释放动态数组:        delete [ ] pi;    如果不小心忘记了空括号,编译器不会捕捉到这个错误, 务必要小心
  • 一般为了避免动态分配数组带来的内存管理的问题, 我们使用c++ 的 标准库vector, list or string 会自动管理内存的容器类型

---------------------

常量对象的动态分配

const int *pic = new const int(1024);

  • const 对象必须被初始化, 否则会编译错误,(因此我们也不能创建const数组,因为const数组不能被初始化,除了类数组)
  • 用new表达式返回的值作为初始值的指针必须是一个指向const类型的指针. eg: const int
  • 它的生命期同样也用delete表达式来结束 eg: delete pic;

<3>定位new表达式(placement new expression)

形式: new (place_address) type-specifier

头文件: #include <new>

place_adress必须是指针

eg:

int *buf = new int[2];

int *pb = new (buf) int;

*pb = 11;

cout << *pb << endl;             // 11

cout << *buf << endl;            // 11

cout << pb << endl;                 // 同样pb跟buf的所指向的地址也是相同的

cout << buf << endl;                //

int *pp = new (buf + 1) int;

*pp = 22;

  • 因为定位符并不分配内存,所以我们并没有与定位符相匹配的delete表达式, 对此我们需要删除的是分配内存的指针,在上面的例子中我们 delete [] buf;new和delete运算符用于动态分配和撤销内存的运算符.

malloc和new的区别 begin的更多相关文章

  1. 细说new与malloc的10点区别

    前言 几个星期前去面试C++研发的实习岗位,面试官问了个问题: new与malloc有什么区别? 这是个老生常谈的问题.当时我回答new从自由存储区上分配内存,malloc从堆上分配内存:new/de ...

  2. realloc,malloc,calloc函数的区别

    from:http://www.cnblogs.com/BlueTzar/articles/1136549.html realloc,malloc,calloc的区别 三个函数的申明分别是: void ...

  3. [reprint]malloc与calloc的区别

    [http://blog.163.com/crazy20070501@126/] 转自某自由人的博客: malloc与calloc的区别 函数malloc()和calloc()都可以用来动态分配内存空 ...

  4. malloc和free的区别

    1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存. 2,对于非内部数据类型的对象而言,光用maloc/free无法满足动 ...

  5. 【转】细说new与malloc的10点区别

    1.申请的内存所在位置 new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存.自由存储区是C++基于new操作符的一个抽象概念,凡是通过new ...

  6. 细说new与malloc的10点区别(转载)

    原地址https://www.cnblogs.com/QG-whz/p/5140930.html#_label1_0 new与malloc的10点区别 1. 申请的内存所在位置 new操作符从自由存储 ...

  7. 【C/C++】malloc和new的区别

    malloc和new的区别 malloc是C语言的内存申请函数.new是C++语言的运算符.所以在.c文件中无法使用new. malloc申请空间时,传递的是size.new申请空间时,传递的是typ ...

  8. C—动态内存分配之malloc与realloc的区别

    在程序的执行期间分配内存时,内存区域中的这个空间称为堆(heap).还有另一个内存区域,称为堆栈(stack),其中的空间分配给函数的参数和本地变量.在执行完该函数后,存储参数和本地变量的内存空间就会 ...

  9. 从内部入手,浅谈malloc和new的区别

    想要理解一样事物,就要先用自己的语言去描述一件事物.在我查阅资料后,发现malloc函数简单说来就是空闲内存空间收集器,并把空闲空间关联起来,用术语来说就是:将空闲内存块合并起来并称为"闲置 ...

随机推荐

  1. ThreadPool线程池的几种姿势比较

    from multiprocessing.pool import ThreadPool #from multiprocessing.dummy import Pool as ThreadPool #这 ...

  2. 数据挖掘算法:DBSCAN算法的C++实现

    (期末考试快到了,所以比较粗糙,请各位读者理解..) 一.    概念 DBSCAN是一种产生划分聚类的基于密度的聚类算法,簇的个数由算法自动地确定.低密度区域中的点被视为噪声而忽略,因此DBSCAN ...

  3. java设计模式之适配器模式以及在java中作用

    适配器作用就是讲一个接口适配到另一个接口,在Java 的I/O类库中有很多这样的需求,如将字符串数据转变成字节数据保存到文件中,将字节数据转变成流数据等. 以InputStreamReader和Out ...

  4. 功能规格说明书Version2

    此功能规格说明书是Week8 功能规格说明书的第二个版本, 版本1地址:http://www.cnblogs.com/Z-XML/p/3407687.html 此功能规格说明书是面向用户的,所以作者将 ...

  5. html页面简单制作示例

    内有表格布局,具体见 链接: https://pan.baidu.com/s/1V7IcxQ5M-iXVdlzuf8bo-A 密码: 8dp8

  6. javascript实现自动切换焦点功能学习

    当用户在表单中填写完当前字段后,能否自动将焦点跳转到下一个字段以方便用户输入? 为了增强易用性,加快数据输入的速度,可以在前一个文本框中的字符达到一定的设置的字符长度后(比如电话号码,身份证号等),用 ...

  7. Java面试题(下)

    这部分主要是开源Java EE框架方面的内容,包括hibernate.MyBatis.spring.Spring MVC等,由于Struts 2已经是明日黄花,在这里就不讨论Struts 2的面试题, ...

  8. 【EasyNetQ】- 发布确认

    默认的AMQP发布不是事务性的,并不保证您的消息实际到达代理.AMQP确实指定了事务发布,但是使用RabbitMQ它非常慢,我们还没有通过EasyNetQ API支持它.对于高性能保证交付,建议您使用 ...

  9. Aspose.Pdf合并PDF文件

    使用Aspose.Pdf类库,有很多种方法可以合并PDF文件,这里简单介绍小生见到的几种: Doucment.Pages.Add PdfFileEditor.Append PdfFileEditor. ...

  10. js & disabled mouse right button menus

    js & disabled mouse right button menus 网页可以屏蔽 F12 https://www.cnblogs.com/Marydon20170307/p/9122 ...