内容清单:

1.  C语言中的函数malloc和free

2.  C++中的运算符new和delete

3.  new/delete与malloc/free之间的联系和区别

4.  C/C++程序的内存分配介绍

具体介绍:

1、C语言的函数malloc和free

(1)malloc 和 free

函数malloc和free在头文件<stdlib.h>中的原型及参数

void * malloc(size_t size)

动态配置内存,大小有size决定,返回值成功时为任意类型指针,失败时为NULL。

void  free(void *ptr)

释放动态申请的内存空间,调用free()后ptr所指向的内存空间被收回。

如果ptr指向未知地方or指向的空间已被收回,则会发生不可预知的错误;

如果ptr为NULL,free不会有任何作用。

(2) C语言中典型用法

T为任意数据类型

T *p = ( T * )malloc( sizeof(T) * n)
if(NULL= =p)
{
printf(“malloc fail!\n”);
……//相关资源收回的处理
exit(-1);
}
… …//此过程不能改变指针p的指向
free(p);

  注意:malloc后通常要对返回值进行判断,避免发生不必要的错误。

(3)内存说明

malloc函数动态申请的内存空间是在里(而一般局部变量存于里),并且该段内存不会被初始化,与全局变量不一样,如果不采用手动free()加以释放,则该段内存一直存在,直到程序退出才被系统释放,所以为了合理使用内存,在不适用该段内存时,应该调用free()。另外,如果在一个函数里面使用过malloc,最好要配对使用free,否则容易造成内存泄露。

2、 C++中的运算符new和delete

new和delete是C++中的运算符,不是库函数,不需要库的支持,同时,它们是封装好的重载运算符,并且可以再次进行重载。

(1)new

new是动态分配内存的运算符,自动计算需要分配的空间,在C++中,它属于重载运算符,可以对多种数据类型形式进行分配内存空间,比如int型、char型、结构体型和类等的动态申请的内存分配,分配类的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。

(2)delete

delete是撤销动态申请的内存运算符。delete与new通常配对使用,与new的功能相反,可以对多种数据类型形式的内存进行撤销,包括类,撤销类的内存空间时,它要调用其析构函数,完成相应的清理工作,收回相应的内存资源。

(3)典型用法
动态变量格式:

类型 指针名称 = new 类型

int *p = new int;        delete p;
char *p = new char; delete p;

类的类型 *p = new 类的类型;    delete p;

//注意,指针p存于栈中,p所指向的内存空间却是在堆中。 

动态数组格式:

类型 指针名称= new 类型 [数组大小]

Obj * p = new Obj[100];     delete [ ]p;

//注意,new申请数组,delete删除的形式需要加括号“[ ]”,表示对数组空间的操作,总之,申请形式如何,释放的形式就如何。

(4)内存说明。

new申请的内存也是存于中,所以在不需要使用时,需要delete手动收回。

3、new/delete与malloc/free之间的联系和区别

(1)malloc/free和new/delete的联系

a)存储方式相同。malloc和new动态申请的内存都位于中。申请的内存都不能自动被操作系统收回,都需要配套的free和delete来释放。

b)除了带有构造函数和析构函数的类等数据类型以外,对于一般数据类型,如int、char等等,两组动态申请的方式可以通用,作用效果一样,只是形式不一样。

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

d)两组都需要配对使用,malloc配free,new配delete,注意,这不仅仅是习惯问题,如果不配对使用,容易造成内存泄露。同时,在C++中,两组之间不能混着用,虽说有时能编译过,但容易存在较大的隐患。

(2)malloc/free和new/delete的区别

a)malloc和free返回void类型指针,new和delete直接带具体类型的指针。

b)malloc和free属于C语言中的函数,需要库的支持,而new/delete是C++中的运算符,况且可以重载,所以new/delete的执行效率高些。C++中为了兼用C语法,所以保留malloc和free的使用,但建议尽量使用new和delete。

c)在C++中, new是类型安全的,而malloc不是。例如:

int* p = new char[10];               // 编译时指出错误

delete [ ]p;                         //对数组需要加中括号“[ ]”

int* p = malloc(sizeof(char )*10);   // 编译时无法指出错误

free (p);                            //只需要所释放内存的头指针

d)使用new动态申请类对象的内存空间时,类对象的构建要调用构造函数,相当于对内存空间进行了初始化。而malloc动态申请的类对象的内存空间时,不会初始化,也就是说申请的内存空间无法使用,因为类的初始化是由构造函数完成的。delete和free的意义分别于new和malloc相反。

e)不能用malloc和free来完成类对象的动态创建和删除。

4、C/C++程序的内存分配介绍

(1)栈内存分配运算内置于处理器的指令集中,一般使用寄存器来存取,效率很高,但是分配的内存容量有限。 一般局部变量函数参数的暂时存放位置。

(2) 堆内存,亦称动态内存。如malloc和new申请的内存空间。动态内存的生存期由程序员自己决定,使用非常灵活。

(3)全局代码区:从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

(4)常量区:文字常量分配在文字常量区,程序结束后由系统释放。

(5)代码区:存放整个程序的代码,因为存储是数据和代码分开存储的。

new、delete与malloc、free的详解的更多相关文章

  1. new和delete的三种形式详解

    一.new操作符.delete操作符 class String { public: String(const char *str="") { if(str== NULL) { da ...

  2. hbase实践之数据读取详解

    hbase基本存储组织结构与数据读取组织结构对比 Segment是Hbase2.0的概念,MemStore由一个可写的Segment,以及一个或多个不可写的Segments构成.故hbase 1.*版 ...

  3. 动态内存管理详解:malloc/free/new/delete/brk/mmap

    c++ 内存获取和释放 new/delete,new[]/delete[] c 内存获取和释放 malloc/free, calloc/realloc 上述8个函数/操作符是c/c++语言里常用来做动 ...

  4. C++之new/delete/malloc/free详解

    主要内容: 1.  C语言中的函数malloc和free 2.  C++中的运算符new和delete 3.  new/delete与malloc/free之间的联系和区别 4.  C/C++程序的内 ...

  5. malloc/free和new/delete详解与应用

    C++面试经常会问到关于malloc/free和new/delete的区别,网上有不同版本的解释,这里总结下并加上个人理解和使用. 两者相同点 1.都可以申请动态堆内存. 两者不同点 1.new/de ...

  6. malloc 与 free函数详解<转载>

    malloc和free函数详解   本文介绍malloc和free函数的内容. 在C中,对内存的管理是相当重要.下面开始介绍这两个函数: 一.malloc()和free()的基本概念以及基本用法: 1 ...

  7. 原生JS:delete、in、typeof、instanceof、void详解

    delete.in.typeof.instanceof.void详解 本文参考MDN做的详细整理,方便大家参考[MDN](https://developer.mozilla.org/zh-CN/doc ...

  8. 详解new/delete(整合)

    C++中内存的动态分配与管理永远是一个让C++开发者头痛的问题,本文通过对C++中内存的动态分配释放的基本原理的介绍,让读者朋友能对C++中的内存的动态分配与释放有较为深入的理解,从而更好驾驭C++程 ...

  9. ASP.NET MVC 5 学习教程:Details 和 Delete 方法详解

    原文 ASP.NET MVC 5 学习教程:Details 和 Delete 方法详解 在教程的这一部分,我们将研究一下自动生成的 Details 和Delete 方法. Details 方法 打开M ...

随机推荐

  1. Centos6.5 telnet wireshark

    yum -y install telnet-server telnet vim /etc/xinted.d/telnet disable = no vim /etc/pam.d/remote #aut ...

  2. ubuntu 14.04 vnc use gnome(ubuntu14.04 gnome for vnc4server)

    New 'jenkinsmaster.cc:3 (root)' desktop is jenkinsmaster.cc:3 Starting applications specified in /ro ...

  3. MySQL必知必会 学习笔记(一)

    第一章  了解SQL 模式:   关于数据库和表的布局以及特性的信息.[描述表可以存储什么样的数据,数据如何分解,各部分信息如何命名等等,可以用来描述数据库中特定的表以及整个数据库(和其中表的关系)] ...

  4. Android UI ActionBar功能-自定义Tab功能

    还可以使用ActionBar实现Tab选项卡功能: 官方帮助文档:http://wear.techbrood.com/training/basics/actionbar/styling.html#Cu ...

  5. Redis事务和分布式锁

    Redis事务 Redis中的事务(transaction)是一组命令的集合.事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行.Redis事务的实现需要用到 MUL ...

  6. magento中的各种form标签

    1. Text Field    $fieldset->addField('title', 'text', array(          'label'     => Mage::hel ...

  7. 系统学习Linux的11点建议

    一.从基础开始 常常有些朋友在 Linux 论坛问一些问题,不过,其中大多数的问题都是很基础的.例如为什么我使用一个命令的时候,系统告诉我找不到该目录,我要如何限制使用者的权限等问题,这些问题其实都不 ...

  8. 华为OJ机试训练(一)

    题目1 -- 通过输入英文句子.将每一个单词反过来,标点符号顺序不变.非26个字母且非标点符号的情况就可以标识单词结束. 标点符号包含,.!? 比如输入:Hello, I need an apple. ...

  9. C-Free 您不能使用调试解决方案

    什么时候C-Free 当您调试 找不到gdb.exe解决方案 http://www.programarts.com/ C-Free 官方网站 下载Mingw或者其他编译器 版权声明:本文博主原创文章. ...

  10. CLR via C# 阅读笔记

    1.char在C#中为16位Unicode字符:int 映射到System.Int32;long映射到System.Int64. 2.重载时C#不考虑返回值,而CLR允许返回值不同,方法名和参数相同的 ...