关于new,delete,malloc,free的一些总结
- 首先,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的一些总结的更多相关文章
- 深入C++ new/delete,malloc/free解析
深入C++ new/delete,malloc/free解析 1.malloc与free是C++/C语言的标准库函数.new/delete是C++的运算符. 它们都可用于申请动态内存和释放内存 2.对 ...
- C++ new delete malloc free
title: C++ new delete malloc free date: 2020-03-10 categories: c++ tags: 语法 C++的new delete malloc fr ...
- new和delete malloc和free
程序中动态分配的对象存放在自由存储区(free store)或堆(heap). C语言程序使用一对标准库函数malloc和free在自由存储区中分配存储空间,而C++语言则使用new和delete表达 ...
- new,delete,malloc,free
malloc/free是C语言中的内存申请和释放函数,利用它们可方便地管理内存.而在C++中我们又有了新的工具:new/delete.new/delete在管理内存的同时会调用类的构造函数和析构函数, ...
- 内存分配方式,堆区,栈区,new/delete/malloc/free
1.内存分配方式 内存分配方式有三种: [1]从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. [2]在栈上创建.在执行函数时 ...
- C++之new/delete/malloc/free详解
主要内容: 1. C语言中的函数malloc和free 2. C++中的运算符new和delete 3. new/delete与malloc/free之间的联系和区别 4. C/C++程序的内 ...
- C++/C语言的标准库函数与运算符的区别new/delete malloc/free
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存.下面来看他们的区别. 一.操作对象有所不同 malloc与free是C++ ...
- 内存分配(new/delete,malloc/free,allocator,内存池)
以下来源http://www.cnblogs.com/JCSU/articles/1051826.html 程序员们经常编写内存管理程序,往往提心吊胆.如果不想触雷,唯一的解决办法就是发现所有潜伏的地 ...
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
内存分配方式 内存分配方式有三种: [1] 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量, static 变量. [2] 在栈上创建.在执行函 ...
- 动态内存的分配(new delete malloc free)
new和malloc的区别是什么?-new关键字是C++的一部分,在所有的C++编译器中都被支持-malloc是由C库提供的函数,在某些系统开发中是不能调用的-new以具体类型为单位进行内存分配-ma ...
随机推荐
- js中checkbox的全选和反选的实现
<head> <meta charset="utf-8"/> <script type="text/javascript"> ...
- Java基础系列--集合之ArrayList
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8494618.html 一.概述 ArrayList是Java集合体系中最常使用,也是最简单 ...
- SpringBoot SpringSecurity4整合,灵活权限配置,弃用注解方式.
SpringSecurity 可以使用注解对方法进行细颗粒权限控制,但是很不灵活,必须在编码期间,就已经写死权限 其实关于SpringSecurity,大部分类都不需要重写,需要的只是妥善的配置. 每 ...
- 天猫精灵X1智能音箱使用感想
11.22音箱到手,等了刚好一个月. 主要是测评语音交互功能. 测试条件:正宗普通话. 1)问天气.温度:表现良好.2)找手机功能:试了多次,每次都说手机号码格式不对3)小孩听故事:正常.但是开头会有 ...
- OpenStack Ironic 常见问题
whole disk和partition 镜像 whole disk镜像部署可以支持windows,但是不能自定义分区(可以通过cloud-init实现),分区表是做镜像的人确定好的,partitio ...
- MySQL SQL语句分析查询优化
如何获取有性能问题的SQL 1.通过用户反馈获取存在性能问题的SQL 2.通过慢查询日志获取性能问题的SQL 3.实时获取存在性能问题的SQL 使用慢查询日志获取有性能问题的SQL 首先介绍下慢查询相 ...
- 类似fabric主机管理demo
类似于fabric的主机管理系统 可以批量对主机进行操作 批量上传文件 批量下载文件 批量执行命令 demo代码 #!/usr/bin/env python # -*- coding:utf-8 -* ...
- 基于busybox的Linux小系统制作 (initrd)
我们有时候有需要在busybox基础上,制作linux,可是却不知道具体怎么做,这里将对基于busybox的linux小系统制作做出详细的步骤说明.准备环境:1.一个Redhat完整系统的虚拟机,本次 ...
- Struts2实现文件上传(一)
Struts2实现文件上传 文件上传成功后结果页面 result.jsp: <%@ page language="java" import="java.util.* ...
- jquery-1.11.1.js
每次想要使用这个js时,总是要到官网上下载,太麻烦,现在把它收录了 jquery-1.11.1.js /*! * jQuery JavaScript Library v1.11.1 * http ...