本帖最后由 screen12 于 2014-02-27 09:35:53 编辑

解决方案 »

  1.   

    GDI对象都需要自己释放,除非你包装成类,由释构函数释放,另外要注意的是GDI对象并不总是会释放成功,释放之前必须从DC中选出
      

  2.   

    我说的不是GDI对象,是GDI+对象,象Image, Bitmap, Graphics等等.
      

  3.   

    GDI+也一样的道理,包装成类就是图个方便,自动由析构函数释放
      

  4.   

    那么象Graphics,Image,Bitmap这样的对象,需要自己手工释放吗?还是函数退出,这些临时变量就自动回收,不需要自己释放?还有,用new Bitmap(...)和Bitmap bitmap(...)这两种方法建立的对象都需要自己释放吗?new出来的可以用delete来释放.那Bitmap bitmap这样建立的对象怎么释放?
      

  5.   

    我说的不是GDI对象,是GDI+对象,象Image, Bitmap, Graphics等等.确实是看错了,gdi+对象都自己会管理好释放,一般不需要使用操心,具体你可以看其释构函数,比如Image的释构函数调用了DllExports::GdipDisposeImage(nativeImage);Image *pimage = new Image(...);必须使用delete 删除,这是必须的
      

  6.   

    那么象Graphics,Image,Bitmap这样的对象,需要自己手工释放吗?还是函数退出,这些临时变量就自动回收,不需要自己释放?还有,用new Bitmap(...)和Bitmap bitmap(...)这两种方法建立的对象都需要自己释放吗?new出来的可以用delete来释放.那Bitmap bitmap这样建立的对象怎么释放?
    析构函数何时被调用?这是C++里很基础的知识,搞清楚了,你就不会有这样的疑问了
      

  7.   

    那么象Graphics,Image,Bitmap这样的对象,需要自己手工释放吗?还是函数退出,这些临时变量就自动回收,不需要自己释放?还有,用new Bitmap(...)和Bitmap bitmap(...)这两种方法建立的对象都需要自己释放吗?new出来的可以用delete来释放.那Bitmap bitmap这样建立的对象怎么释放?
    析构函数何时被调用?这是C++里很基础的知识,搞清楚了,你就不会有这样的疑问了按照我的理解,如果是在一个函数中定义一个GDI+对象,当函数退出的时候,这个对象的生存期也就结束了,它会自动调用析解函数,释放内存.
    听说Bitmap类并没有释放内存的析构函数,但是Bitmap类是继承自Image类,当派生类对象生存期结束时,先调用派生类析构函数,再调用基类析构函数,也就是说,它仍然可以释放申请到的内存资源.如果这样理解的话,在函数中创建的GDI+对象,是不需要手工释放内存的,函数退出时系统自动释放.包括象(GDI+中的画笔,画刷,字体,字体风格还有象PointF, RectF等等,都是不需要自己手工释放内在的,是吗?不知道这样理解对不对?
      

  8.   

    计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……对学习编程者的忠告:
    眼过千遍不如手过一遍!
    书看千行不如手敲一行!
    手敲千行不如单步一行!
    单步源代码千行不如单步对应汇编一行!单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
    对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
    (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)