C++ 中malloc()和free()函数的理解

C++ 中malloc()和free()函数的理解

关于malloc和free这两个函数,malloc的用法示例:int *p=(int *)malloc(2*sizeof(int)); 它表示在堆中开辟一块大小为2*sizeof(int)的一块内存空间,p指向这块内存空间的起始地址,malloc前面的(int*)表示这块空间用来存储int型数组。开辟了这块空间后,可以修改这个空间中的值,例如为*p,*(p+1)做赋值操作,如果再次使用malloc函数,例如再写一个 int *q=(int *)malloc(2*sizeof(int)); 此时开辟的以q为起始地址长度为2*sizeof(int)的空间是不会覆盖p所指向的空间的。但是,如果在int *q=(int *)malloc(2*sizeof(int));之前写一个free(p),那么,q所指向的空间则有可能覆盖p指向的空间。所谓的free(p)操作,其实是修改p所指向的空间的标记值,让其可以被覆盖。尽管执行了free(p),p仍就指向以前的起始地址,依旧可以对*p,*(p+1)赋值,并且可访问他们(例如输出)。

代码如下:

int main(){
  int *p=(int *)malloc(2*sizeof(int));
  free(p);
  *p=1;
  *(p+1)=2;
  cout<<p<<endl<<(p+1);
  cout<<endl;
  cout<<*p<<endl<<*(p+1); 

  int *q=(int *)malloc(2*sizeof(int));
  cout<<endl<<q<<endl<<(q+1);
  cout<<endl<<*q<<endl<<*(q+1);
  return 1;
}

运行结果:

补充:

int *p=(int *)malloc(2*sizeof(int)); 若要释放这段空间,必须free(p),只是单单想释放部分空间,例如free(p+1)是不允许的。

以上就是C++ 中malloc()和free()函数的实例详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • C++遍历文件夹下的所有文件

    数据分多个文件存储,读取数据就需要对多个文件进行操作.首先就需要定位到文件的名字,之后再对文件进行相应的读写操作.多次涉及多文件的读写操作,现将这个实现总结一下,方便自己和他人使用.具体代码如下: #include "stdafx.h" #include <stdio.h> #include<iostream> #include<vector> #include <Windows.h> #include <fstream> #

  • C++面试题之结构体内存对齐计算问题总结大全

    前言 本文给大家介绍的是关于C++结构体内存对齐计算的相关内容,内存对齐计算可谓是笔试题的必考题,但是如何按照计算原则算出正确答案一开始也不是很容易的事,所以专门通过例子来复习下关于结构体内存对齐的计算问题.话不多说,来一起看看详细介绍吧. 编译环境:vs2015 对齐原则: 原则1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个

  • 从C语言过渡到C++之引用(别名)

    今天要讲的是C++中我最喜欢的一个用法--引用,也叫别名. 引用就是给一个变量领取一个变量名,方便我们间接地使用这个变量.我们可以给一个变量创建N个引用,这N + 1个变量共享了同一块内存区域. 1. 声明引用 创建引用的格式如下: 数据类型 引用名 = 原变量 比如: int a = 1; int& b = a; 在这段代码中,我们给变量a创建了一个别名b.它们公用同一块内存区域,就是创建变量a时申请的区域. 注意:由于引用并不需要申请一块新的内存空间,因此在建立引用时只能声明,不能定义. 面

  • 关于C++中菱形继承和虚继承的问题总结

    前言 菱形继承是多重继承中跑不掉的,Java拿掉了多重继承,辅之以接口.C++中虽然没有明确说明接口这种东西,但是只有纯虚函数的类可以看作Java中的接口.在多重继承中建议使用"接口",来避免多重继承中可能出现的各种问题.本文将给大家详细介绍关于C++菱形继承和虚继承的相关内容,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍吧. 继承: 1. 单继承–一个子类只有一个直接父类时称这个继承关系为单继承 2. 多继承–一个子类有两个或以上直接父类时称这个继承关系为多继承 例如下面

  • C++数据精度问题的解决方案(对浮点数保存指定位小数)

     1.背景 对浮点数保存指定位小数.比如,  1.123456.   要保存1位小数,,调用方法后, 保存的结果为: 1.1. 再比如,1.98765,  保存2位小数的结果为: 2.00. 2. 解决方案 A.添加头文件 #include <sstream> #include <iomanip> B.添加命名空间 using namespace std; C.添加函数 /*******************************************************

  • JNI实现最简单的JAVA调用C/C++代码

    JNI,是Java Native Interface的简称,中文是"Java本地调用".通过这种技术可以做到以下两点: Java程序中的函数可以调用Native语言写的函数,Native一般指的是C/C++编写的函数. Native程序中的函数可以调用Java层的函数,也就是说在C/C++程序中可以调用Java的函数. 本篇博客带给童鞋们以下内容,学习内容来自(传智播客),经由小巫总结整理: javah工具的用法 按照C/C++头文件来编写C/C++源文件 将C/C++源文件编译成动态

  • C++ 中malloc()和free()函数的理解

    C++ 中malloc()和free()函数的理解 关于malloc和free这两个函数,malloc的用法示例:int *p=(int *)malloc(2*sizeof(int)); 它表示在堆中开辟一块大小为2*sizeof(int)的一块内存空间,p指向这块内存空间的起始地址,malloc前面的(int*)表示这块空间用来存储int型数组.开辟了这块空间后,可以修改这个空间中的值,例如为*p,*(p+1)做赋值操作,如果再次使用malloc函数,例如再写一个 int *q=(int *)

  • 关于c语言中回调函数的理解

    前言 在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 这段话不是那么好理解,不同语言实现回调的方式有些许不同.其实可以这样理解,回调就是在一个函数中调用另外一个函数. 在c语言中,回调是使用函数指针来实现的. 函数指针--顾名思义,是指向一个函数的指针.通常函数指针有两个方面的用途,一个是转换表(jump table),另一个是作为参数传递给一个函数. 下面是两个函数指针的声明 int(*f)(i

  • JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解

    首先还是看看JavaScript: The Definitive Guide, 4th Edition中对三个函数的定义. Math.ceil(): round a number up Arguments: Any numeric value or expression Returns: The closest integer greater than or equal to x. ---------------------------------------------------------

  • Kotlin中关于内联函数的一些理解分享

    前言 看了很多博客,才明白了内联的含义,其实最根本的就是将写在别处的代码拷贝到你现在执行的方法中,相当于在一个方法中执行,java的方法执行是需要压栈出栈的对吧,如果是两三个方法那就是两三次的压栈出栈,为了节省这个操作,提高一定的效率,kotlin就出了这么个函数.但又想想,如果是个超级大的函数,考来考去的也是很麻烦啊,所以这东西需要自己权衡吧,遵守单一职责,降低代码圈发杂度才是根本. 内联函数的理解 inline函数(内联函数)从概念上讲是编译器使用函数实现的真实代码来替换每一次的函数调用,带

  • python中super()函数的理解与基本使用

    目录 前言 super的用法 super的原理 Python super()使用注意事项 混用super与显式类调用 不同种类的参数 总结 前言 Python是一门面向对象的语言,定义类时经常要用到继承,在类的继承中,子类继承父类中已经封装好的方法,不需要再次编写,如果子类如果重新定义了父类的某一方法,那么该方法就会覆盖父类的同名方法,但是有时我们希望子类保持父类方法的基础上进行扩展,而不是直接覆盖,就需要先调用父类的方法,然后再进行功能的扩展,这时就可以通过super来实现对父类方法的调用.

  • 深入理解React中何时使用箭头函数

    前言 相信大家当想起箭头函数时,脑海里可能会浮现 棒,酷,简洁,有趣 等形容词,其实,我们存在一些 更充分的理由 使我们在联想起 箭头函数 时不得不想到的,本文详细的给大家介绍了关于React何时使用箭头函数的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 解决 this 引起的问题 箭头函数不会在函数体内重新定义 this 的值,这使得在回调中的行为更容易预测,并且避免了 this 在回调中潜存的 bug 下面我们来看一个 example 我们期望点击按钮,改变按钮颜

  • javascript中闭包概念与用法深入理解

    本文实例分析了javascript中闭包概念与用法.分享给大家供大家参考,具体如下: 1.问题的引出,什么时候会遇到闭包? 首先因为JS是没有块状作用域的,但是有函数作用域即函数作为了局部变量之间的界限,不同函数内的局部变量具有独立性, 因为JS没有块状作用域,笔者初学JS时,在事件的监听时,因为不理解JS中局部变量的作用域,犯过不少错误! (1)JS中的变量作用域 for(var i=0;i<9;i++) { } alert(i) //输出9 我们发现,虽然变量i是块状区域for()内的一个局

  • PHP中mb_convert_encoding与iconv函数的深入解析

    mb_convert_encoding这个函数是用来转换编码的.原来一直对程序编码这一概念不理解,不过现在好像有点开窍了. 不过英文一般不会存在编码问题,只有中文数据才会有这个问题.比如你用Zend Studio或Editplus写程序时,用的是gbk编码,如果数据需要入数据库,而数据库的编码为utf8时,这时就要把数据进行编码转换,不然进到数据库就会变成乱码.mb_convert_encoding的用法见官方:http://php.net/manual/zh/function.mb-conve

  • Python的math模块中的常用数学函数整理

    在数学之中,除了加减乘除四则运算之外--这是小学数学--还有其它更多的运算,比如乘方.开方.对数运算等等,要实现这些运算,需要用到 Python 中的一个模块:Math 模块(module)是 Python 中非常重要的东西,你可以把它理解为 Python 的扩展工具.换言之,Python 默认情况下提供了一些可用的东西,但是这些默认情况下提供的还远远不能满足编程实践的需要,于是就有人专门制作了另外一些工具.这些工具被称之为"模块" 任何一个 Pythoner 都可以编写模块,并且把这

  • JavaScript中5种调用函数的方法

    这篇文章详细的介绍了Javascript中各种函数调用的方法及其原理,对于理解JavaScript的函数有很大的帮助! JavaScript,调用函数的5种方法 一次又一次的,我发现,那些有bug的Javascript代码是由于没有真正理解Javascript函数是如何工作而导致的(顺便说一下,许多那样的代码是我写的).JavaScript拥有函数式编程的特性, 当我们选择面对它的时候,这将成为我们前进的阻碍. 作为初学者,我们来测试五种函数调用的方法,从表面来看我们会认为那些函数与C#中函数的

随机推荐