绝对经典的问题!!低手莫进!
在dos下应用程序在使用new 及delete时使用堆内存时,若分配与释放时间不当会产生大量内存碎片。而在windows中,操作系统本身有种机制,可以在空闲时移动整合一些不连续的内存碎片,使其留出最大内存块以供使用。我现在所做的系统要求实时不间断的运行(2000 server下),程序在运行中使用了大量的new和delete操作,请问高手们:windows本身能否保证真正的不产生内存碎片吗??我现在不能完全确信这一点,请各位指点!! 问题点数:0、回复次数:26Top
1 楼flyelf(空谷清音)回复于 2003-09-02 19:10:36 得分 0
可以自己写一个内存池来自己进行分配Top
2 楼syl5005(syl5005)回复于 2003-09-02 19:11:14 得分 0
本来大家还想要进来看一看的,你却---低手莫进!这样不好!!!
你的问题是有难度,只有微软自己的人才好说清楚,对不起,我也不懂。Top
3 楼he_zhidan(何志丹:www.dzlishi.net,www.vcshare.net)回复于 2003-09-02 19:11:45 得分 0
:windows本身能否保证真正的不产生内存碎片吗?
不能
Top
4 楼tonybaobao(Tony宝宝)回复于 2003-09-02 19:16:58 得分 0
即使是NTFS也会产生文件碎片,只不过有大有小而已。所以,如果你的程序会使new操作无法正常进行的话,那首先应该考虑改进你的程序和算法!Top
5 楼huangqishang(时光村落)回复于 2003-09-02 19:28:06 得分 0
我的这个程序要求实时性很高,而且该程序不能中断,我担心运行半年甚至一年后会导致过多的内存碎片而使系统瘫痪!我不是十分确信windows是否真正的有这种内存片的移动机制。如果有,我就不用担心了,我就害怕它没有!Top
6 楼awnucel(西大耻犹未雪,南京恨何时灭&抵制日货)回复于 2003-09-02 19:30:11 得分 0
你的担心恐怕是成立的Top
7 楼Portege2010(不高兴)回复于 2003-09-02 19:35:45 得分 0
事实上,内存是以4k为一个页,386cpu的分页机制将以4K为单位的不连续不规则的内存片段映谢成线性地址,使得程序看以来他们是连续的.
事实上,在物理内存中是不可能连续的.Top
8 楼wkgenius()回复于 2003-09-02 19:39:13 得分 0
Windows应该是不能保证不产生内存碎片,不过应该不会对你的程序产生影响,我以前写过一个频繁的调用new和delete的程序,就没有任何问题。Top
9 楼everandforever(Forever)回复于 2003-09-02 19:41:05 得分 0
如果要运行一年半载的话,不如写个缓存池Top
10 楼piggybank(吞硬币的小猪)回复于 2003-09-02 19:42:11 得分 0
awnucel(三十功名臣与土※八千里路云和月)(峰宸) ( ) 信誉:97 2003-09-02 19:30:00 得分:0
你的担心恐怕是成立的
_______________________________________________
如果你觉得有必要的话,
_______________________________________________
回复人: flyelf(空谷清音) ( ) 信誉:100 2003-09-02 19:10:00 得分:0
可以自己写一个内存池来自己进行分配
Top
11 楼howtotell(从何谈起)回复于 2003-09-02 19:56:36 得分 0
char* buf;
for(;;)
{
buf=new char[10240];
delete buf;
}
这样的程序也不会崩溃的。Top
12 楼tolixiaohui()回复于 2003-09-02 20:24:48 得分 0
有没有碎片,你根本就不用关心,操作系统会处理的
windows 作的相当完善了,
只要不是 漏洞!Top
13 楼sakurar(开发者绝不是好玩家)回复于 2003-09-02 20:34:05 得分 0
用内存池。
不论从性能还是稳定性考虑,自己管理内存才是明智的。Top
14 楼huangqishang(时光村落)回复于 2003-09-02 20:39:05 得分 0
如果分配和释放是适当的,肯定不会有的。这我知道,但我程序的分配和释放的是不确定的,
比如:
while(1)
{
char *buf1 = new char[8000];
char *buf2 = new char[20];
delete []buf2;
delete []buf1;
}
若在单线程中执行上段程序绝对不会有内存碎片。因为后分配的先释放。但我的程序是多线程,而且即使在同一线程中,也没能完全保证如上述代码一样。比如有下列情况发生(会有碎片先分配先释放):
while(1)
{
char *buf1 = new char[8000];
char *buf2 = new char[20];
delete []buf1;
delete []buf2;
};
上面这段代码就会产生碎 片了。更何况我是多个线程都在new和delete呢??其实我只是想
知道windows操作系统有没有真正的的这种机制,在空闲时把内存碎片组合到一起??我想有一部分朋友还没有真正明白我所问的这个问题的实质。
Top
15 楼huangqishang(时光村落)回复于 2003-09-02 20:57:34 得分 0
我还想问大家,如果要做内存池,应该如何做?我原来没有做过这种东西。而且做内存池后,我的程序修改量会不会很大?请高手们指点!Top
16 楼fish1976(fish1976)回复于 2003-09-02 20:58:48 得分 0
我觉得这个问题和已明确的告诉你,在c++下使用new malloc,windows 不会给你回收内存的,所以对于内存泄露,还是自己解决吧!Top
17 楼dzqsuper(数风流人物-还看打倒日本猪的人(抵制日货))回复于 2003-09-02 21:05:33 得分 0
我是低手
但是我进来了
你能拿我怎么着吧Top
18 楼cryincold(夜来☆幽梦忽还【湘】)回复于 2003-09-02 21:13:15 得分 0
呵~~我是低手中的高手,高手中的低手。我究竟是只什么手哩?Top
19 楼huangqishang(时光村落)回复于 2003-09-02 21:19:02 得分 0
我觉得我的问题够明确了,可是fish1976居然还误解我?让我难过呀。。。:)我说的不是内存泄露,而是内存碎片!!内存泄露我肯定保证在我程序里是不会有的。还有那位dzqsuper,真的让我看到你的
"我是低手 但是我进来了 你能拿我怎么着吧"后大笑了一番哟。。。真够幽默的哟。其实大家只是在一起交流而已,我希望所有的不管高手低手,都互相学习。我也是低手哟。。。。问题之所以这个名字,是为了"吸引"大家。哈哈。。。并无他意!
Top
20 楼windbells(风铃)回复于 2003-09-02 21:31:47 得分 0
to cryincold(梦里幽梦忽还【湘】☆★☆★)
俺知道 是扒手。Top
21 楼Analyst()回复于 2003-09-02 21:50:06 得分 0
从逻辑地址空间上来说频繁的分配释放必然产生内存碎片,系统也无法将这些碎片在逻辑地址空间上合并,否则你的指针就失效了。用GC机制的话到可以消除碎片,在每次清扫之后,GC会把分配的内存空间合并。从物理内存上来说就更加不连续了,内存单元以4K为一个分页,分页可能在物理内存里也可能在硬盘上,这个是由系统来管理的,这里有没有碎片已经无关紧要了。Top
22 楼nonocast(如果没有如果)回复于 2003-09-02 21:54:45 得分 0
自己管理内存
呵呵
如果可以的话
可是...Top
23 楼asign(局外人@http://blog.csdn.net/asign)回复于 2003-09-02 21:56:13 得分 0
markTop
24 楼jjqiao710102(aqiao)回复于 2003-09-02 22:01:14 得分 0
自已管理内存较好!
Top
25 楼echoher(Est Sularus oth Milthas)回复于 2003-09-02 22:13:36 得分 0
sgi stl中对于小的内存(128字节一下)会用二级分配机制,就是内存池
loki库中也有类似的机制,推荐看看源码
侯捷的《stl源码刨析》第二章有详细解释Top
26 楼huangqishang(时光村落)回复于 2003-09-02 22:23:36 得分 0
我手头没有<sstl源码刨析>,我想知道内存池的实现方法,哪位高手可否指点?Top




