你的用法好象有问题。
其实在MSDN中有模板类使用的实例——collect
CArray<CPoint,CPoint> m_ptArray; // 直接生成实例,而不是用typedef 构建一个新类
CPoint p;加入元素用m_ptArray.Add(p);
删除用RemoveAt()
只要在析构前用RemoveAll()应该不会内存泄漏。

解决方案 »

  1.   

    多谢了,你说的用法我知道,我的也没错,可以这样用,《vc技术内幕》中就是这样用的,不过我发现当add()很多时,进程使用的内存有所增长,在removeall()后,内存使用并不降下来,在进程退出时,内存才释放干净,不知道为什么?哪位了解,给讲解一下。
      

  2.   

    在RemoveAt()后要
    Delete掉你的元素
      

  3.   

    1.CArray的析构函数自动调RemoveAll
    2.放心地用RemoveAt,用了之后内存使用并不下降可能是因为VC自已的内存管理技巧。VC一般对小块内存的申请是从先前分配的大块内存中分配。比如,据我所知,CString类申请空间一次申请至少256字符,尽管字符串可能比这小,如果有两个100个字符的字符串,它们可能都占用这256空间,并不新申请内存;如果有一个字符串被析构了,那256空间也不销毁,直到空间内所有字符串都被析构为止。我想CArray也是这样。
      

  4.   

    removeat()只是把指针删除掉
    而用delete()才能把指针指向的内容删除掉。
    比如:a is a point 地址是0x0020 它的内容是一个地址 0x0030
         b is a number 地址是0x0030 它的内容是5;
         a是CArray 中的一个元素,当用a.ramovetAt()时,只是把a 的内容删除了,
        也就是说 *a不再等于b了,但实际上,b中的内容并没有删除,
        得用delete()
      

  5.   

    to sunriselx:
    你的typedef行确实令人费解,能解释一下吗?
    我一直都在用philiploo的方法。
      

  6.   

    to phoenixs99:
        按你说的,每次add()时,要先new,不然delete会出错的,删除时先getat(),removeat(),delete?不过我看书上add时并没有new,而直接加入对象,所以我还是同意horris的看法,你说呢?to dusj:
        typedef CArray<CPoint,CPoint&> CPointArray;
        CPointArray pointarray;
        pointarray.add();
       .....
    这样就行了,把CPointArray当作类使用就行了
      

  7.   

    呵呵呵,是不是你写错了噢,这样写我就认识了。
    不管add的对象是在heap还是在stack中,add操作都会作一份对象拷贝的,而这个对象的空间在removeall()或removeat()时被释放,不能delete。所以add()中的参数对象是否要delete,那就要由你看着办了。
    CPoint *p=new CPoint;
    p->x=10; p->y=20; pointarray.add(*p);delete p;//在pointarray中又有了一份CPoint.
    在destructor中会自动调用removeall(),释放array中的CPoint.所以,无论如何,都不用delete.
    至于内存占空间的问题,CArray为提高效率和防止memory frag,预设有一定的空间。可以查看SetSize().有详细说明。
      

  8.   

    to dusj:
        写的简单了一点,不好意思。
        一个问题:
                pointarray.setsize(pointarray.getsize()+1);
                pointarray.setat(GetUpperBound(),p );
        这样能不能防止memory frag呢?(想法而已)
                
      

  9.   

    to phoenixs99(phoenixs):你的方法适用于元素是指针的情况,如不是指针,则是多余的。
    to dusj(小兔乖乖) & sunriselx() : typedef用的没有问题
      

  10.   

    ?关于NT的NetBIOS错误『高手请入』(Danphel) 2-24 11:47 数据库开发类
    有谁能帮我解答?分数可以再加!!!
      

  11.   

    ?关于NT的NetBIOS错误『高手请入』(Danphel) 2-24 11:47 数据库开发类
    有谁能帮我解答?分数可以再加!!!
      

  12.   

    如果准备在循环中使用这些语句,可以不太好的。
    不如这样:
    pointarray.setsize(newsize, -1);
    pointarray.setatgrow(index, p);
    一切的increase都由MFC操心去吧。
      

  13.   

    to dusj:
        我一次只想加一个,怎样做好一点呢?