• 首先,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. [翻译] 编写高性能 .NET 代码--第二章 GC -- 减少分配率, 最重要的规则,缩短对象的生命周期,减少对象层次的深度,减少对象之间的引用,避免钉住对象(Pinning)

    减少分配率 这个几乎不用解释,减少了内存的使用量,自然就减少GC回收时的压力,同时降低了内存碎片与CPU的使用量.你可以用一些方法来达到这一目的,但它可能会与其它设计相冲突. 你需要在设计对象时仔细检 ...

  2. http权威指南笔记

    请求报文 响应报文GET /test/hi.txt HTTP/1.0 起始行 HTTP/1.0 200 OKAccept: text/* 首部 Content-type: text/plainAcce ...

  3. ios设备触发虚拟键盘输入后position:fixed 无效的一些简单另类的解决方法。

    首先看一下我要解决的问题,第一张图是正常的情况下,第二张图是点击了输入框之后的情况,就是要解决此问题~! 百度了一下解决方法,好像有以下的一些方法: 1. iscroll 2. Jquery Mobi ...

  4. Egret学习笔记 (Egret打飞机-4.添加主角飞机和实现飞行效果)

    今天继续写点击了开始之后,添加一个飞机到场景中,然后这个飞机的尾巴还在冒火的那种感觉 先拆解一下步骤 1.首先完成飞机容器的图片加载 2.然后把容器添加到场景中 3.然后实现动画 -首先,我们新建一个 ...

  5. C# 13行代码带你模拟登录QQ空间

    最近想做一个QQ空间点赞的小工具,于是晚上下班回来就开始分析PC版的QQ空间,打开Chrome,切换到Network,然后输入账号密码,然后点击登录... 然后,我曹....一堆请求就开始了....搞 ...

  6. JavaScript 一个进行枚举选择的jquery插件(仿easyui风格)

    某次做项目要实现一个功能: 按星期选择一个连续的时间范围 比如:周一到周五,周六到周日 或 周六到周三 聪明的朋友马上想出办法:用两个选项为周一到周日的下拉列表实现,对 那样可以,但是我觉得不够友好, ...

  7. Qt 信号如何自动连接槽函数?

    on_objectName_signal [static] void QMetaObject::connectSlotsByName(QObject *object) void on_<obje ...

  8. service不死之身

    为了应用常驻后台,避免被第三方杀掉的方法 1)Service设置成START-STICKY kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样 2)通过startForegrou ...

  9. UVA-11882 bfs + dfs + 剪枝

    假设当前已经到达(x,y),用bfs判断一下还可以到达的点有maxd个,如果maxd加上当前已经经过的长度小于当前答案的长度就退出,如果相同,就将bfs搜索到的点从大到小排序,如果连最大序列都无法大于 ...

  10. python如何使用pymysql模块

    Python 3.x 操作MySQL的pymysql模块详解 前言pymysql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而M ...