`
hesihua
  • 浏览: 228766 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
社区版块
存档分类
最新评论

C与C++中内存分配释放-malloc,free,new,delete

    博客分类:
  • c++
 
阅读更多

1. new的执行过程:   (1)通过operator new申请内存   (2)使用placement new调用构造函数(简单类型忽略此步) (3)返回内存指针

2. new和malloc的比较: (1)new失败时会调用new_handler处理函数,malloc不会,失败时返回NULL (2)new能通过placement new自动调用对象的构造函数,malloc不会 (3)new出来的东西是带类型的,malloc是void*,需要强制转换 (4)new是C++运算符,malloc是C标准库函数

3. delete的执行过程: (1)调用析构函数(简单类型忽略此步) (2)释放内存

4.delete和free的比较 (1)delete能自动调用对象的析构函数,malloc不会 (2)delete是C++运算符,free是C标准库函数

5. new的三种形态:new operator, operator new, placement new (1)new operator 上面所说的new就是new operator,共有三个步骤组成(申请内存,调用构造函数,返回内存指针),对于申请内存步骤是通过运算符new(operator new)完成的,对于调用什么构造函数,可以由placement new决定。 (2)operator new 像普通运算符一样可以被重载,operator new会去申请内存,申请失败的时候会调用new_handler处理,这是一个循环的过程,如果new_handler不抛出异常,会一直循环申请内存,直到成功。 重载运算符new:

 

class Test {
public :
void * operator new (size_t size) { ... }
};

operator new默认会去申请内存,成功了会返回内存地址,失败了会调用new_handler,然后再去申请内存,一直循环。所以operator new要返回,必须满足一下条件: A. 在程序启动的时候预留一部分内存,在new_handler里释放这部分内存,使得operator new能成功分配到内存 B.抛出bad_alloc异常 C.直接退出程序(abort, exit) D.设置新的new_handler处理函数,set_new_handler(0)取消当前处理函数,默认抛出bad_alloc异常 (3)placement new 用于定位构造函数,在指定的内存地址上用指定类型的构造函数构造对象。 例如:new(ptr) Test("hello");// ptr->Test::Test("hello");

我们可以利用malloc+placement new来构建自己的内存管理模块,创建对象时,通过malloc申请一个内存块,然后调用placement new来完成对象的初始化;释放对象时,首先调用对象的析构函数,然后通过free释放空间.

 

上文来自:http://www.cnblogs.com/sujz/articles/2044429.html

分享到:
评论

相关推荐

    Malloc和new区别

    3 ,因此C++ 语言需要一个能完成动态内存分配和初始化工作的运算符new ,以一个能完成清理与释放内存工作的运算符delete.注意ne w/delete 不是库函数。 4 ,C++ 程序经常要调用C函数,而C 程序只能用malloc/free ...

    C++动态内存分配(new/new[]和delete/delete[])详解

    C++动态内存分配(new/new[]和delete/delete[])详解 为了解决这个普通的编程问题,在运行时能创建和销毁对象是基本的要求。当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变...

    C++中对使用malloc/new引起的内存泄露的检查

    C++中对使用malloc/new引起的内存泄露的检查,重载new/malloc delete/free来进行代码检查

    C++内存分配详解

    C++程序内存分配详解。堆与栈的比较。new/delete与malloc/free比较。

    深入理解C++中的new/delete和malloc/free动态内存管理及区别介绍

    malloc/free只是动态分配内存空间/释放空间;new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理资源。 malloc/free需要手动计算类型大小且返回值类型为void*;new/delete可自动计算类型的大小,...

    C++中new与delete、malloc与free应用分析

    一般来说,在C/C++的面试时,对于new/delete和malloc/free这两对的使用和区别经常被考查到,如果这种基础的问题都答不上来,估计很难过面试了。本文即是对new/delete和malloc/free这两对的使用和区别较为简单的分析...

    C++中malloc与free、new与delete的详解与应用

    1.new/delete是C++的操作符,malloc/free是C/C++的标准库函数。 2.new申请的可以理解为对象,new时会调用构造函数,返回指向该对象的指针,delete时调用析构函数;malloc申请的只是内存,不是对象。 3.new/delete...

    里仁教育详细讲解malloc/free和new/delete

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

    malloc 与new的区别

    C语言提供了malloc和free两个系统函数,完成对堆内存的申请和释放。而C++则提供了两个关键字new和delete;

    c++ 面试 2009

    1.new、delete、malloc、free关系 delete会调用对象的析构函数,和new...因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数

    C++内存管理.doc

    2.1 C++中动态内存分配引发问题的解决方案 2.2 如何对付内存泄漏? 2.3浅谈C/C++内存泄漏及其检测工具 2.3.1 内存泄漏的定义 2.3.2 内存泄漏的发生方式 2.3.3 检测内存泄漏 2.3.3.1 VC下内存泄漏的检测方法 2.3.3.2 ...

    C/C++动态分配与释放内存的区别详细解析

    1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void *malloc(unsigned int num_bytes); 说明:分配长度为num_bytes字节的内存块。如果分配成功则返回指向被分配内存的指针...

    踏入C++中的雷区C++内存管理详解

    内存分配方式有三种:  (1)从静态存储区域分配。...程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

    11_new&delete与malloc&free 之间的关系与区别1

    11_new&delete与malloc&free 之间的关系与区别1

    C++动态分配和撤销内存以及结构体类型作为函数参数

    虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算符。new运算符的例子: new int; //开辟一个存放整数的存储空间,返回一个指向该存储空

    后端,面试,c++ ,找工作

    ## sizeof和strlen的区别 sizeof是一个操作符,strlen是库函数。 sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为‘0‘的字符串作参数。...注意:malloc申请的内存空间要用free释放,而new

    C++中new和delete的介绍

    1.malloc,free和new,delete区别。 a.malloc,free是C/C++的标准库函数。new,delete是c++的操作符。 b.malloc申请的是内存,严格意义不是“对象”,new申请的可以理解为“对象”,new 时会调用构造函数,返回指向该...

Global site tag (gtag.js) - Google Analytics