我正在做一个读取和显示BMP图像的程序,我采取的方法是点扫描输出到显示器上。 老师说,需要在CProjectDoc::CProjectDoc()中分配好内存;在CProjectDoc::~CProjectDoc()中释放内存 
然后在CProjectView::OnDraw(CDC* pDC)中,获取像素值,然后输出。 我的疑问是:1.在CProjectDoc类结束的时候,我们释放了内存,是不是说我们所指定的那块内存已经没有数据了,既然这样,那我们在OnDraw()函数中获取的像素值,是从哪里获得的呢? 2.我用了GlobalAlloc()为PBITMAPINOF指定内存块,用LocalAlloc()为数据部分指定内存块。 
那这两者的区别在这里,在MSDN中的解释是从堆中指定内存块,这样的话,他们岂不是重叠了? 

解决方案 »

  1.   

    ~CProjectDoc()在结束时才自动调用,所以你中途使用没问题
      

  2.   

    问题1,OnDraw中CProjectDoc的对象已经析构了?????
      

  3.   

    上面两位的回答,看的不是很明白。我是把主要的代码都写在①CProjectDoc::OnOpenDocument(),这里面包括头文件的判断,数据大小的计算,数据的读取。而②OnDraw()函数是发生在窗口重绘的时候的,在这个函数里有个③CZaDoc* pDoc = GetDocument()当我加载一张BMP图像后,那么他们的执行顺序是怎么样的呢。①②③还是②③①
      

  4.   

    1)GlobalAlloc和LocalAlloc是早期Windows中的内存分配函数,在Windows 3.1中(非保护模式的实模式),因为内存分堆和远堆。因此GlobalAlloc和LocalAlloc会分别从远堆和堆中进行分配;在近代的操作系统中(Win32体系),已经没有这样的区别了,使用GlobalAlloc和LocalAlloc、malloc都没有太大的本质区别,个人喜好使用GlobalAlloc----比malloc更灵活些;使用C++建议使用new/delete,这样可以加载自己实现的更高效内存管理----Windows的内存管理并非是最高效率的,多数在效率敏感的程序中,我们都自己单独实现内存管理;
    2)通过GlobalAlloc/LocalAlloc除非显式释放,否则在析构函数中不会被自动释放;