| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3017 人关注过本帖, 3 人收藏
标题:对new 实现机制的分析
取消只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏(3)
 问题点数:0 回复次数:0 
对new 实现机制的分析
// 平台:VC6.0
#include   <stdio.h>  
#include   <stdlib.h>
#include   <malloc.h>
#include   <assert.h>
//#include   "vclib.h"


double *Alloc_Double_Array(long length)
{
    double *array = NULL;
    
    if( NULL == (array = new double [length]) )
    {
        fprintf(stdout, "Merory Exhausted\n");
        return NULL;
    }
    //memset(array, 0, length*sizeof(double));
    return array;
}

template <typename T>
void Free_Array (T **array)
{    
    assert( array != NULL);
    printf("array=0x%p,*array=0x%p\n",array,*array);
    delete  *array;
     //delete  []array;
}

int main()  
{  
    double *p1 = Alloc_Double_Array(0x100);
    double *p2 = Alloc_Double_Array(0x100);
    printf("p1=0x%p,p2=0x%p\n",p1,p2);
    p1[0] = 1.3;
    p2[0] = 2.3;

    Free_Array(&p1);
 
     p1 = Alloc_Double_Array(0x100);
    //p1 = Alloc_Double_Array(0x100);
    p1[0] = 1.3; // 为什么不报错?
    p2[0] = 2.3;
    printf("p1=0x%p,p2=0x%p\n",p1,p2);

    Free_Array(&p2);
    p2 = Alloc_Double_Array(0x90);
    double *p3 = Alloc_Double_Array(0x10);
    p3 = Alloc_Double_Array(0x10);
    p3 = Alloc_Double_Array(0x10);
    p3 = Alloc_Double_Array(0x10);

    printf("p1=0x%p,p2=0x%p,p3=0x%p\n",p1,p2,p3);
    p3 = Alloc_Double_Array(0x10);
    printf("p1=0x%p,p2=0x%p,p3=0x%p\n",p1,p2,p3);

    return 0;
}
上述试验中  p3 的值没有出现 p2 + 0x90 = 0x00382868 + 0x90 = 0x003828f8  ,而是跳过了这个值,个人认为这说明new 在申请内存空间时,当没有找到一个空闲的内存空间刚好和期望的一致时,它将用一个比自己大的空间赋给这个指针,并且把多余的部分空间给丢弃调,而没有把这个大空间分割成两个小空间,重新把小空间连入链表供new查找
注意:不同的计算机,由于运行这个程序的时候,空闲的内存分布不一样,所以并不一定刚好能使用上述代码得到相同的现象。但是,只要适当增加 或者减少 p3 = Alloc_Double_Array(0x10);(也就是这个红色的p3 = Alloc_Double_Array(0x10);操作次数要结合实际情况适当调整 ) 操作,则一定也能复现这种现象。

new.GIF (3.74 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册


new.GIF (3.74 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: new 机制 空间分配 
2008-11-01 01:20
快速回复:对new 实现机制的分析
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013656 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved