• 首先,new,delete都是c++的关键字并不是函数,通过特定的语法组成表达式,new可以在编译的时候确定其返回值.可以直接使用string *p=new string("asdfgh");来直接赋值。这其中在调用new分配空间得时候的时候,系统其实直接调用了类或结构的构造函数来对对其进行赋值,这个过程就相当于是string p=string("asdfgh"); 或者string p("asdfgh");(其实上面的过程还是有一定的不同之处;一 个显示式调用,一个隐式调用,两者都是在进程虚拟地址空间中的栈中分配内存,而第一种使用了new,在堆中分配了内存,而栈中内存的分配和释放是由系统管 理,而堆中内存的分配和释放必须由程序员手动释放,所以这就产生一个问题是把对象放在栈中还是放在堆中的问题,这个问题又和堆和栈本身的区别有关)    对于类和结构体这样子很方便,对一般的数据类型这样就没什么必要了。  在对这样子的分配空间进行内存释放的时候直接调用delete来释放,delete p就可以了。这个过程中,对于一般数据类型就直接释放,对于类或者结构体delete调用其析构函数类释放内存。
  • 用new来分配多块内存的时候就要使用new[]来分配,eg:char* p=new char[size];string *p=new string [size];在这个过程中new[]干了两件事,一个是记录要分配的数量size,(可以是在分配的内存前一段某个位置额外分配分配了几个字节来说储存数据来记录大小,也可以是在后台专门有一个表来记录各个数组的大小,这与内存分配器的工作方式有关。你可以以n种方式来实现这个过程,但是必须要能记录数组的大小)再向系统申请分配内存并返回数组的指针(而不是所有分配的空间的起始地址)。对于结构体或者类,new[]调用构造函数size次,其实质还是记录大小和分配空间两件事。对于用new[]分配的内存在释放的时候就必须用delete[]来释放,直接delete[] p就可以了。delete[]怎么知道要释放多大的内存或调用多少次析构函数,就是由于在new分配的时候专门特意的记录了要分配数组的大小,delete[]的时候就先读取这个值,然后调用size次析构函数来释放空间或者根据size来直接释放空间。
  • void *operator new(size_t);     //allocate an object
    void *operator delete(void *); //free an object void *operator new[](size_t); //allocate an array
    void *operator delete[](void *); //free an array

    这是在c++11 new中对这几个函数的定义,平时可直接使用,但再次主意new[]分配的只能通过delete[]来释放,如果用delete的话这只能释放掉数组的第一项,后边的还是存在的。因为数组的地址就是数组第一项的地址。所以new[]的一定要用delete[]来释放。

  • malloc与free都是c语言中的函数,malloc的返回值为void型,在使用的时候要注意对其进行类型转换,                               eg:char* p=(char*)malloc(number*sizeof(char));malloc在分配内存的时候是以字节来分配的。在分配之前也会记录数组的大小和类型。最后返回一个指向数据区的void型指针。malloc分配的内存必须通过free来释放。与malloc有关的函数还有calloc与realloc,其中calloc在分配完内存返回指针之前把所有的数据都初始化为0,相当于malloc加上memset。realloc函数可以吧原来分配的好的内存块的改变大小。动态分配的内存必须是整体一块释放,但是realloc可以缩小一小块动态分配的内存,有效的释放他尾部的部分内存。
  • 关于在调用delete或者free之后系统是否真正的释放了内存的问题。可以通过程序+任务管理器性能窗口来进行检测
    #include<stdio.h>
    #include<stdlib.h>
    #include<Windows.h>
    char*ch[1000];
    int size = 20000;
    int main()
    {
    int i, j;
    for (int i = 0; i < 1000; i++)
    ch[i] = (char*)malloc(sizeof(char)*size);
    for (i = 0; i < 1000;i++)//换入内存,如不进行操作,glibc并不会真正的向系统申请内存
    for (j = 0; i < size; j++)
    ch[i][j] = ' ';
    Sleep(20000);//在此期间查看内存使用情况
    for (i = 0; i < 1000; i++)
    free(ch[i]);
    Sleep(20000);//再次查看内存使用情况
    return 0;
    }

    实验发现,free前与free后的内存使用情况是相同,并没有因为free而空闲出很多内存。而当程序跑完最后的return 0;之后内存使用率才真正的降下来。此时程序涉及到的内存才真正的被完全释放。所以答案是free并没有真正释放内存,相关内存块储存的东西仍然在,而free与delete的过程只是切断了指针与内存块的联系,这块内存本身在没有其他的数据对其进行修改的时候一直都储存着其原来的东西。有其他的内存分配需求的时候这块内存很可能就被分配过去了,然后谁想怎么改就怎么改(就类似于优盘格式化后不向里边写入新东西,原来的东西还是存在的一样)(如果分配到的内存特别特别大的话,free后有可能内存使用率直接降下来,这与操作系统内存管理有关)

  • warning:      1.不管是用new还是用malloc在进行内存分配的时候都要先检查一下是否分配到内存,分配完了之后要赶紧检查一下返回指针是否为NULL;不管是用free还是用delete或者delete[]释放完内存之后都要把原本来指针变为空指针,要不然就变成野指针了,很危险。 2.一个new对应一个delete,一个new[]对应一个delete[],一个malloc对应一个free,必须这样子。要不然会造化内存泄露。也不要对直接定义了的变量或者数组进行free或者delete;不能free一个非malloc返回的指针,不能delete一个非new返回的指针。

关于new,delete,malloc,free的一些总结的更多相关文章

  1. 深入C++ new/delete,malloc/free解析

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

  2. C++ new delete malloc free

    title: C++ new delete malloc free date: 2020-03-10 categories: c++ tags: 语法 C++的new delete malloc fr ...

  3. new和delete malloc和free

    程序中动态分配的对象存放在自由存储区(free store)或堆(heap). C语言程序使用一对标准库函数malloc和free在自由存储区中分配存储空间,而C++语言则使用new和delete表达 ...

  4. new,delete,malloc,free

    malloc/free是C语言中的内存申请和释放函数,利用它们可方便地管理内存.而在C++中我们又有了新的工具:new/delete.new/delete在管理内存的同时会调用类的构造函数和析构函数, ...

  5. 内存分配方式,堆区,栈区,new/delete/malloc/free

    1.内存分配方式 内存分配方式有三种: [1]从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. [2]在栈上创建.在执行函数时 ...

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

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

  7. C++/C语言的标准库函数与运算符的区别new/delete malloc/free

    malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存.下面来看他们的区别. 一.操作对象有所不同 malloc与free是C++ ...

  8. 内存分配(new/delete,malloc/free,allocator,内存池)

    以下来源http://www.cnblogs.com/JCSU/articles/1051826.html 程序员们经常编写内存管理程序,往往提心吊胆.如果不想触雷,唯一的解决办法就是发现所有潜伏的地 ...

  9. C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free

    内存分配方式 内存分配方式有三种: [1] 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量, static 变量. [2] 在栈上创建.在执行函 ...

  10. 动态内存的分配(new delete malloc free)

    new和malloc的区别是什么?-new关键字是C++的一部分,在所有的C++编译器中都被支持-malloc是由C库提供的函数,在某些系统开发中是不能调用的-new以具体类型为单位进行内存分配-ma ...

随机推荐

  1. Spring中的applicationContext.xml实现自动装配

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  2. Unicode字符集,各个语言的区间

    链接:http://www.cnblogs.com/zl0372/p/unicode.html 链接:http://www.unicode.org/ 链接:https://zh.wikipedia.o ...

  3. APP性能测试(电量)

    #encoding:utf-8 import csv import os import time #控制类 class Controller(object): def __init__(self, c ...

  4. VxWorks 任务

    任务:在执行时每个程序都被称之为任务.VxWorks操作系统中,任务可以直接地或者以共享方式访问大多数系统资源,为了维护各自的线程,每个任务必须保持有足够的上下文环境.(1)    任务状态:就绪(R ...

  5. FusionCharts重写单系列图

    /** * @Title:FusionChart.java * @Package:com.yhd.chart.model * @Description:封装FusionChart单系列图 * @aut ...

  6. Excel 2010高级应用-条状图(五)

    Excel 2010高级应用-条状图(五) 基本操作如下: 1.新建一个Excel空白文档,并命名条状图 2.单击"插入",找到条状图的样图 3.选择其中一种类型的条状图样图,在空 ...

  7. 获取JSON对象的属性值

    1.问题背景 有一个json对象,其中有键值对,那怎样获取json对象中属性值 2.实现源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...

  8. Linux系统挂载NTFS文件系统

     今天尝试并成功的将一块500G的移动硬盘挂载到了RHEL5的系统上,甚感欣慰.想到也许以后自己或其他同学们会有类似经历,于是尽量细致的记录于此.     无论是一块安装了Windows/Linu ...

  9. 创建数据库表默认字段封装SQL

    declare @Table_Name varchar(500) declare @strSQL varchar(500) set @Table_Name='UserInfo' --在此处设置要创建的 ...

  10. CF#418 Div2 D. An overnight dance in discotheque

    一道树形dp裸体,自惭形秽没有想到 首先由于两两圆不能相交(可以相切)就决定了一个圆和外面一个圆的包含关系 又可以发现这样的树中,奇数深度的圆+S,偶数深度的圆-S 就可以用树形dp 我又写挫了= = ...