mallco动态分配_malloc动态分配的内存的生存周期是多少?

曾经有一个朋友提过这样一个问题,malloc动态分配的内存的生存周期是多少当时直接回答,当然是在调用free进行释放之前阿!!但回头我仔细想过这个问题,在free调用之前那段范围内,但free只有一个指针参数,它是如何知道要释放多少空间呢比如:

int*pInt=(int*)malloc(10*sizeof(int));

…….;

free(p);

这里free是如何知道释放10个int大小的空间呢既然free只需要一个参数—指针类型,那么这个地址(malloc返回的)一定作过什么特殊处理了.于是我问了一些网上的朋友,我得出以下一些结果:

char*p=malloc(size):

1. 实际分配一块size + 4大小的内存,char *p = 内存首地址。

2. *((int *)p) = size; //把大小放在分配内存的起始处。

3. return (void*)(p + 4); //返回除去存放大小以后的部分。

free(p); 1. char* q = (char *)p - 4;

2. int size = *((int *)q); //这里找到了size...

3. 通过操作系统释放内存或自己管理C/C++堆内存.

这里要涉及到一些OS管理内存得问题,非我力所能及,但我们可以知道,malloc确实实施了一些特殊的处理.言归正传.让我们看看下面一段c++代码:

int*p=new int;

delete []p;

一眼就看出上面得代码完成的和上面的c代码一样的功能.这里有同样的问题,为什么delete

能在不指定动态分配的数组size下就能释放所分配的对象呢,是不是new操作也对返回的地址作了一些手脚?答案:是.new所作的处理和上面的方法一样的,即:new所传回的每一个内存区域配置一个额外的DWORD,然后把元素数目包藏到那个DWORD中.(不是所有编译器都采用这个方法的,我只试过vc6和bcc55编译器,它们都采用这个方法.不过,深度探索c++对象模型上只是说配置一个额外的word两字节).为了验证这个说法,我写下了下面的代码进行测试.

#includeiostream.h

class complex

{

public:

complex(int=0,int=0){cout"complex()"endl;}

~complex(){cout"~complex()"endl;}

private:

int i,j;

};

int main()

{

complex*array=new complex;

long*t=(long*)((char*)(array)-4);

cout*tendl;//(1)

//*t=20; //(2)

delete []array;

return 0;

}

其中(1)输出array数组的维数10.这里很明显了,动态分配complex对象的个数就是放在返回array地址前一个DWORD(四个字节)内.现在问题解决了,我们已经知道new所作的什么处理了,^_^,不过问题又来了,编译器采取的策略会不会引起我们忧虑对,的确,只要我们修改那个DWORD的内容,那delete就不能正确释放所分配的内存空间了.(^_^.你试试把(2)前面那条的注释给去掉,就会有意想不到的输出)

结论:c++编译器为我们做了太多的事,导致了c++很复杂,有些东西,让编译器修改得连我们都不认识自己的代码了,有些东西如果搞明白了,学其他的(比如COM,ATL等,虽然本问与此关系不大)或许会轻松许多的.

补充:这是小弟第一篇处女作,肯定有很多说得不当的地方,还请各位大小谅解.我得于众多csdn上的朋友相助,还参考了侯老师的那本深度探索c

++对象模型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中兴中心管理服务器fxh3120,中兴多媒体业务中心ZXMS80

运营支撑层: 提供面向视讯用户的客服中心和面向管理员的业务中心、网管中心。客服中心提供会议预约、会议控制、帐单查询、意见反馈等功能。业务中心分为业务受理中心、业务管理中心、认证计费中心。其中业务受理中心实现开户、放号及收费等功能;业务管理…

随机森林经典文

原文链接 转载于:https://www.cnblogs.com/luoganttcc/p/10525324.html

python namespace unique_Python使用uuid库生成唯一标识ID

uuid是128位的全局唯一标识符(univeral unique identifier),通常用32位的一个字符串的形式来表现。有时也称guid(globalunique identifier)。python中自带了uuid模块来进行uuid的生成和管理工作。python中的uuid模块基于信息如MAC地址、时间戳、命名空间、随机数、伪…

SQL Server 2008空间数据应用系列四:基础空间对象与函数应用

SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 原文:SQL Server 2008空间数据应用系列四:基础空间对象与函数应用友情提示,您阅读本篇博文的先决条件如下: 1、本文示例基于Microsoft SQL Server 2008 R2调测。 2、具…

HBase-1.2.4LruBlockCache实现分析(一)

一、简介 BlockCache是HBase中的一个重要特性,相比于写数据时缓存为Memstore,读数据时的缓存则为BlockCache。 LruBlockCache是HBase中BlockCache的默认实现,它采用严格的LRU算法来淘汰Block。 二、缓存级别 目前有三种缓存级别&#xf…

c .net ajax,Asp.net mvc 2中使用Ajax的三种方式

在Asp.net MVC中,我们能非常方便的使用Ajax。这篇文章将介绍三种Ajax使用的方式,分别为原始的Ajax调用、Jquery、Ajax Helper。分别采用这三种方式结合asp.net mvc去实现一个史上最简单的留言板。首先看一下原始的Ajax的调用的:定义CommentController&am…

爆款AR游戏如何打造?网易杨鹏以《悠梦》为例详解前沿技术

本文来自网易云社区。 7月31日,2018云创大会游戏论坛在杭州国际博览中心103B圆满举行。本场游戏论坛聚焦探讨了可能对游戏行业发展有重大推动的新技术、新实践,如AR、区块链、安全、大数据等。 网易AR游戏生态合作负责人杨鹏表示,传统游戏模式…

景深决定照相机什么特性_照相机光圈与景深的关系

展开全部「光圈」,光圈是一个用来控制光线透过镜头,进入机身636f70793231313335323631343130323136353331333264663664内感光面的光量的装置,它通常是在镜头内。表达光圈大小我们是用f值。光圈f值镜头的焦距/镜头口径的直径从以上的公式可知要…

润乾V4导出TXT时自定义分隔符

◆ 背景说明 报表中,导出text时,默认没有分隔符;应用中对导出Text,希望能自定义分隔符。在tag中定义了 textDataSeparator属性,让用户在导出Text时自定义分隔符,从而确保满足应用…

Spark学习体会

在去年图计算工作中,和公司里实习的博士生尝试过Spark后,发现Spark比Hadoop在计算速度上后很大的提高。Spark的计算使用Scala语言编写代码,其中图计算用到了GraphX。对Spark技术的学习已经非常重要。 最近半年多时间里,经常看…

fastadmin自定义按钮不是ajax,Fastadmin 自定义按钮实现审核功能

功能描述新增自定义审核按钮,点击审核按钮后,按钮变为取消审核按钮,同理点击取消审核按钮后,按钮变为审核按钮实现功能如下图微信图片_20200827112914.png上代码{field: operate, title: __(Operate), table: table, events: Tabl…

函数的命名空间以及作用域

转载于:https://www.cnblogs.com/mpfei/p/9451208.html

python获取路由器数据包pppoe_PPPoE协议***4:如何得到PPPoE服务器的mac地址

在局域网中,怎样得到PPPoE服务器的mac地址是一件头疼的事情,特别是在windows环境下;得到PPPoE服务器mac地址的实现方法有两种:1.在windows下,我们运行wireshark软件,可以得到所有进出网卡的数据包格式和内容…

使用vs自带的性能诊断工具

visual studio是个强大的集成开发环境,内置了程序性能诊断工具。下面通过两段代码进行介绍。 static void Main( string[] args){Test1();Test2();Console.ReadKey();}protected static void Test1(){Stopwatch sp new Stopwatch();sp.Start();string str "&…

Avg_row_length是怎么计算的?

通过一下命令我们可以获取表的使用情况: rootmysql 05:49:33>show table status like tbname\G 结果: *************************** 1. row ***************************Name: tbnameEngine: InnoDBVersion: 10Row_format: CompactRows: 3425Avg_row_…

1.用代码演示String类中的以下方法的用法 (2018.08.09作业)

1 public class Test_001 {2 3 public static void main(String[] args) {4 String a "德玛西亚!";5 String b "";6 String c "aBcDefG";7 String d " 123321 ";8 System.out.println…

【Java基础】List迭代并修改时出现的ConcurrentModificationException问题

现在有一个需求,要遍历一个List,假设List里面存储的是String对象,然后该需求事判断里面如果有某个对象,则添加一个新的对象进去。自然,我们得出下面的代码: import java.util.ArrayList; import java.util.…

tp5框架原理详解_TP5框架安全机制实例分析

本文实例讲述了TP5框架安全机制。分享给大家供大家参考,具体如下:防止sql注入1、查询条件尽量使用数组方式,具体如下:$wheres array();$wheres[account] $account;$wheres[password] $password;$User->where($wheres)->f…

碧蓝航线8.20服务器维护,碧蓝航线半人马来袭 8.20更新公告

半人马来袭!碧蓝航线将于8月20日9:00~11:00对安卓、iOS全港区进行为期2小时的改造建设,维护后将开启限时活动「盛夏的半人马座」,一起来看看吧。一、内容新增1.开启限时活动「盛夏的半人马座」,活动时间8月20日维护后~8月30日&…

MySQL安装与设置

下载zip,配置 1,系统变量添加:...\mysql-5.7.10-winx64,环境变量添加:%MYSQL_HOME%\bin 2,修改MySQL.ini basedir(同系统变量路径) datadir(系统变量路径\data) port 33…