我在MFC中 自定义了 类A
然后在主界面类的多个函数(fun1(), fun2(), ...)中  分别定义了多个对象指针  并申请了内存:
fun1()
{
   A* a1;
   a1 = new A();
}fun2()
{
   A* a2;
   a2 = new A();
}
......若要在 主界面类的 另一个函数中释放他们(a1, a2, ...)  该如何处理呢? Tip:
     fun1() //申请并创建
     {
        CButton* btn;
        btn = new CButton;
        btn->Create(..., 1); // 1为其 ID 号 
     }
     
     fun2() //释放内存
     {
        CButton* b = (CButton*)GetDlgItem(1);
        delete b; 
     }
     是否有类似的处理呢?

解决方案 »

  1.   

    fun1()
    {
    return new a;
    }
    fun2()
    {
    return new b;
    }
    funmain()
    {
    c = fun1();
    d = fun2();
    delete c;
    delete d;
    }
      

  2.   

    CButton* b = (CButton*)GetDlgItem(1);
    delete b;
    这样处理应该是不行的 没有b指向的不是堆内存
      

  3.   

    我觉得稳妥的方法是建立里一个全局指针,在声明时就赋予指针值,要释放时,应用try看有没有异常。好多天不编程了,有有些生疏了。
      

  4.   

    防止野指针的方法其实最好是
    赋初值NULL
    到不用的时候判断指针是否为NULL
    不是则delete;
      

  5.   

    To aganpro(阿甘):
    你说的似乎很有道理, 能否具体一点啊?
    谢谢!谢谢各位
      

  6.   

    很多时候,内存的申请和释放并不能总是封装到一个类中的,总会有一些这样的情况,要求 内存能够跨类(实际上是跨实例,某些实例负责申请,某些实例负责使用顺带销毁,这些实例不一定是同一个类)或者函数使用。这种现象在多线程中很常见。常用的一种方法是: 维护一个全局的结构,一般是一个队列或者是hash表之类的东西
    当有内存申请时候,到该全局结构中注册一下, 遇到那种随机的释放的时候就到该表注销以下,
    (注销过程也顺带释放了该对象或者指针的内存空间)等到 某个处理完结,或者是程序完结的或者是某个需要的释放时机,比如 某些类的析构的时候
    就扫描一遍这个全局结构,将没有注销的注销。就能够做到,内存不会泄漏了。
    其实正常的情况下,一般我们都能够保证内存都会得到释放的,但是如果碰到异常的情况,而内存释放的代码被短路,没有被执行就会有问题。这种情况常常会被忽略,(不是因为编程不小心,而是有时候情况确实太复杂了)上述的解决方式能够有效的弥补这个不足。
      

  7.   

    To sjjf(水晶剑锋):
    谢谢你的指点!能否 点一下这种 队列或hash 的大体组织结构
    谢谢!