是这样的:class A
{
....
};class B
{
  A *pB_A;
....
};class C
{
  A *pC_A;
....
};.........如何对pB_A和pC_A进行判断?(假设在此之前以对pB_A和pC_A赋值,然后单独释放了它们所指向的对象)

解决方案 »

  1.   

    不要钻牛角了,一定要自己记住,要么用程序代码记;
    方式很多,要么用全局变量、要么再class A 里加个链表记住都有谁指向自己了。
      

  2.   

    to z_sky:
    如果我在class A 里加个链表记住都有谁指向自己,当释放class A时,将链表中的指针都恢复为空。但是,如果class B或class C先释放呢?
      

  3.   

    你释放B、C的实例时要么释放其中的A类型指针指向的对象,要么从A类型对象的链表中去掉自己不就行了吗
      

  4.   

    当你释放class A时,把pB_A=NULL; pC_A=NULL;在用pB_A,和pC_A时先判断是否为空
      

  5.   

    看代码:struct c{
    C(){nRef=1;};
    int AddRef(){
    return ++nRef;
    }
    int Release(){
    if(!--nRef)
    {
     delete this;
     return 0;
    }
    return nRef;
    }
    protected:
    virtual~c()//donot allow delete from outsides
    {}
    int nRef;};
    struct a{
    a(c* pc)
    {
    m_pc=pc;
    pc->AddRef();
    }void do_Sth(){
    ;//...使用完成m_pc了
    m_pc->Release();
    m_pv=NULL;
    }protected:
    c* m_pc;
    }
    class b的结构和a也差不多,就不写了
    下面是main函数:
    void main()
    {
    c* pc=new c;
    a clsA(pc);
    b clsB(pc);
    pc->Release();//ok pc was hold by both clsA and clsB,so we don't need it.release.
    pc=NULL;
    a.do_sth();
    b.do_sth();;//should no memory leak
    }
    这个方面的问题我专门写了一篇文章,过几天放上来。
      

  6.   

    其实写到最后看起来就好像是COM了,不过没有研究过COM,不知道是不是就是这么回事
      

  7.   

    to Kevin:
        你的方法类似于COM的引用计数的方法,这种方法在有被引用的情况下对象不能释放。    我想找一种方法:当class A的对象自己释放时,不用遍历引用自己的对象,而引用它的对象又能够判断它已被释放的简单方法。
      

  8.   

    这里有一篇文章,非常有帮助,希望大家都来看看
    《C++ Without Memory Errors》by Dejan Jelović
    http://www.jelovic.com/articles/cpp_without_memory_errors_slides.htm
    其中有个工具,就叫工具吧,很多时候都可以使用,这可是秘密武器。
      

  9.   

    ok~再来一个方法,可能比较烂 :P
    struct A{
    ....
    };struct B{
    B(A* pa){m_rpa=pa;}
    protected:
    A*& m_rpa;
    };struct C{
    C(A* pa){m_rpa=pa;}
    protected:
    A*& m_rpa;
    };
    void main()
    {
    A* pa=new A;
    B b(pa);
    C c(pa);
    delete pa;
    pa=NULL;//b,c可以根据m_rpa的值来判断pa是否有效;
    }
      

  10.   

    另外还可以使用callback的方法来通知B/C类,不过实在是比较麻烦,而且也没有什么必要
      

  11.   

    让对象自行解决自己(内存管理).把对象仍到组件里,再用接口将你和对象分离,你亲吻她的接口(Release())就行了.其实任何对象的问题都能用DLL来解决,而任何DLL的问题都能用COM解决,而任何COM的问题都能用MFC/ATL解决,而MFC/ATL把Release方法都封装好了,其实实现细节和Kevin_qing所说的类似
      

  12.   

     c 就上这样的。 你更本就不可能知道你的指针是有效的还是无效的。 这要靠你自己去
     把握! 
      example:
          CYourObject * lpYourObject1 = new CYourObject;
          CYourOjcet * lpYourObject2 = lpYourObject1;
          delete lpYourObject1;  // 这时 lpYourObject2 还是指向原来的内存地址 ,编译
         //器并不会把 lpYourOjbect2 付值 为 NULL . 所有说 一个指针是不是有效是程序员的
         // 事情        
      

  13.   

    有一个函数可以试一下!
    BOOL AfxIsValidAddress( const void* lp, UINT nBytes, BOOL bReadWrite = TRUE ); 
    第一个值是你的指针!第二个是对象的大小!第三个是说明你要判断这块的地址是可读写(TRUE〕的还是只读的(FASLE〕;
    SDK中也有类似的函数如
    BOOL IsBadCodePtr(
                     FARPROC lpfn   // address of function
                     );
    BOOL IsBadReadPtr(
                    CONST VOID *lp,  // address of memory block
                    UINT ucb         // size of block
                    );BOOL IsBadStringPtr(
                   LPCTSTR lpsz,  // address of string
                   UINT ucchMax   // maximum size of string
                   );
    BOOL IsBadWritePtr(
                  LPVOID lp, // address of memory block
                  UINT ucb   // size of block
                  );