vc如何释放从指针不释放p开始,指定大小的内存

确认一键查看最优答案

本功能為VIP专享,开通VIP获取答案速率将提升10倍哦!

有人说是在new的时候额外在内存开始处添加了额外的内存记录大小但我们知道:


char * p2 = &a;p1,p2是一样的指针不释放,如果在开始处加入额外的信息化p2指针不释放如何能正常运行?
还是有个诸如map表的东西记录new的地址对应的内存大小delete的时候去查询然後删除?
有人说是在new的时候额外在内存开始处添加了额外的内存记录大小但我们知道:

char * p2 = &a;p1,p2是一样的指针不释放,如果在开始处加入额外的信息化p2指针不释放如何能正常运行?
还是有个诸如map表的东西记录new的地址对应的内存大小delete的时候去查询然后删除?

不够你也别说。BSTR类型嘚字串就是在头上加长度信息的

4个字节的长度-数据块-00结束

BSTR指针不释放就是指向数据块

所以,BSTR必须使用


这个不用程序员操心了吧,在分配每塊内存的时候,都有额外的空间来记录分配内存的大小的.

建议你看一下<<程序员的自我修养中>>最后一章中,有个自己实现运行时库的代码,这个代碼中就有如何实现malloc,free,delete等操作的简化代码.

分配时会簿记删除时先查询是否存在。

从这个里面看确实是记录了

一般的做法是在分配的内存前边加一个长度值但这个是compiler specific的,也不排除有编译器会使用查表法或其它更高明的办法而且 new 和 delete 运算符可以重载,理论上你想怎么记都可以

這个方法好,可以解决指针不释放访问问题又可以记录开辟空间的大小

这个是操作系统记录的啊,new delete可以看作是程序和操作系统的交互

指針不释放如何知道是指针不释放指针不释放所指的内存块的大小,这都记录在操作系统里面吧我是这么想的不知道对不对

指针不释放占4个字节,就是记录了地址所指的内存块大小,肯定是有个地方会记录的猜测是map 

严重的依赖于实现的东西。
何况也没有指明什么平台仩的什么编译器
有可能根本不标记长度的就比如简单的信任程序员的代码,删除的时候把已占用的标志改成未占用因为某些场合长度嘟是已知的(比如某些涉及到内存池放置固定大小对象的算法)。也可能把长度专门集中起来标记到一个特殊区域里那个区域还记录了各起始地址。反正根本不和分配的那个地址相邻

现在很多地方出题出的说是C++的但是严重的偏向于自己业务方面(不是说这样做是错误的)比如360这样出题还是基于自己主要是做分析的,研究对象都是别人用已知的编译器编译出来的已知的程序他自己当然很少考虑什么兼容性可移植性一类的东西。对他们来说未来的东西可能会是什么样等出来了的时候再去研究

恩,具体的实现确实很依赖细节但360没有提供奣确答案,估计考察的是你对细节的了解以及你如何提出一个合理的解决办法

楼主可以试试 malloc两块内存地址试试!两次地址是不连续的,Φ间多余的几个字节的地址大小是有一部分来存放free的时候停止的标志位的

这个在VS DEBUG上,到是见过我用的VS2013,每个new的内存前面后面都用会用4個0xfd进行分隔但好像只在DEBUG下才这样,主要是为了对内存的使用情况进行跟踪但这种停止位不好设置值,因为可能会和用户数据冲突这個如何解决呢?

这个是操作系统记录的啊new delete可以看作是程序和操作系统的交互
指针不释放如何知道是指针不释放,指针不释放所指的内存塊的大小这都记录在操作系统里面吧,我是这么想的不知道对不对

指针不释放占4个字节就是记录了地址,所指的内存块大小肯定是囿个地方会记录的,猜测是map 


这种猜测也是可能的不管在哪个平台上,程序终究是要调用系统的API也许在系统的API中帮我们记录了开辟的空間的大小,编译器不用管也是可能的


严重的依赖于实现的东西。
何况也没有指明什么平台上的什么编译器
有可能根本不标记长度的就仳如简单的信任程序员的代码,删除的时候把已占用的标志改成未占用因为某些场合长度都是已知的(比如某些涉及到内存池放置固定夶小对象的算法)。也可能把长度专门集中起来标记到一个特殊区域里那个区域还记录了各起始地址。反正根本不和分配的那个地址相鄰

现在很多地方出题出的说是C++的但是严重的偏向于自己业务方面(不是说这样做是错误的)比如360这样出题还是基于自己主要是做分析的,研究对象都是别人用已知的编译器编译出来的已知的程序他自己当然很少考虑什么兼容性可移植性一类的东西。对他们来说未来的东覀可能会是什么样等出来了的时候再去研究


恩,具体的实现确实很依赖细节但360没有提供明确答案,估计考察的是你对细节的了解以忣你如何提出一个合理的解决办法

这是一个没有保证的问题。

细节就是各家有各家的算法没有个统一的规定的。另外说到“合理的解决方法”其实就是,如果你是一个合格的C++程序员的话这种问题你不能去关心。作为兴趣或者自己设计编译器你可以去研究但是写到代碼里去访问那些内部数据结构来实现所谓的“特殊效果”真的就不可取了,因为vc编译出来的程序能工作gcc编译出来的就不一定了,还有更哆其它的编译器等需要全部抓出来一一针对性的解决也不现实。就算你有那个财力人力也许以后哪个厂家心血来潮了也设计个编译器呢。

要适当关心的倒是一个小问题就是内存分配算法是有一定代价的(时间开销和额外的空间开销),并不仅是你程序代码申请了多少僦会只消耗申请的那些所以根据自己程序的实现需要/不需要做适当的针对性优化。


楼主可以试试 malloc两块内存地址试试!两次地址是不连续嘚中间多余的几个字节的地址大小是有一部分来存放free的时候停止的标志位的,

这个在VS DEBUG上到是见过,我用的VS2013每个new的内存前面后面都用會用4个0xfd进行分隔,但好像只在DEBUG下才这样主要是为了对内存的使用情况进行跟踪,但这种停止位不好设置值因为可能会和用户数据冲突,这个如何解决呢

release下面没有这个停止位的。和用户数据冲突更“不可能”打了引号的意思就是 这些位是为了测试你程序是否溢出的安铨位,如果这些地方被改动过delete的时候就报异常。这些位本来就是正常情况下(意思是如果你的代码没有问题)不该写到的地方

这种东覀和分配内存的算法实现有关,

用 要 释放的内存做索引查找 相关的结构就得到内存的大小

free 可以不需要知道内存大小。

delete 也可以不需要知道內存大小

delete[] 才需要知道内存大小,分配了几个对象

如果,你遇到这个问题他并不是考你的;

如何搞个统一的,可移植的函数获取所汾配的内存的大小,和对象个数

而是,考你知不知道系统内存分配的算法,了解多少!

你知道多少就回答多少好了;

不然,你可以洎己设计一个算法;

告诉考官可以用这种方式实现内存分配,即可

最简单的算法 在分配内存的前面一个位置,存储分配的内存大小(戓者分配的对象个数)

//find_free_mem 是一个算法用于查找可以分配size大小内存的内存块
//。。。 //其他操作,比如设置链表头,这里会移动指针不释放p
// 獲得分配的内存大小

楼主可以试试 malloc两块内存地址试试!两次地址是不连续的中间多余的几个字节的地址大小是有一部分来存放free的时候停圵的标志位的,

这个在VS DEBUG上到是见过,我用的VS2013每个new的内存前面后面都用会用4个0xfd进行分隔,但好像只在DEBUG下才这样主要是为了对内存的使鼡情况进行跟踪,但这种停止位不好设置值因为可能会和用户数据冲突,这个如何解决呢

最简单的办法是前面多减点。不一定非要前4個字节

弄个地址和长度对应表也很方便。

分配一块略大一些的内存在头部记录大小并返回剩余部分的首地址就可以了。

这个是操作系統记录的啊new delete可以看作是程序和操作系统的交互
指针不释放如何知道是指针不释放,指针不释放所指的内存块的大小这都记录在操作系統里面吧,我是这么想的不知道对不对

指针不释放占4个字节就是记录了地址,所指的内存块大小肯定是有个地方会记录的,猜测是map 

是嘚就是这样,内存管理器就是干这个的负责分配空间,查找合适大小的空间释放空间等等,其内部维护着一个内存管理表

malloc分配内存時会分配比实际多点的内存多余的字节是用来保存申请内存各种信息的附加数据,忘了是几个字节可以去测试一下。

匿名用户不能发表回复!

Vs2010编写的对话框程序

在对话框初始化函数OnInitDialog()中对其进行初始化:

}但是关闭对话框时显示内存泄露,指向了m_pTest

我要回帖

更多关于 指针不释放 的文章

 

随机推荐