你的用法好象有问题。
其实在MSDN中有模板类使用的实例——collect
CArray<CPoint,CPoint> m_ptArray; // 直接生成实例,而不是用typedef 构建一个新类
CPoint p;加入元素用m_ptArray.Add(p);
删除用RemoveAt()
只要在析构前用RemoveAll()应该不会内存泄漏。
其实在MSDN中有模板类使用的实例——collect
CArray<CPoint,CPoint> m_ptArray; // 直接生成实例,而不是用typedef 构建一个新类
CPoint p;加入元素用m_ptArray.Add(p);
删除用RemoveAt()
只要在析构前用RemoveAll()应该不会内存泄漏。
Delete掉你的元素
2.放心地用RemoveAt,用了之后内存使用并不下降可能是因为VC自已的内存管理技巧。VC一般对小块内存的申请是从先前分配的大块内存中分配。比如,据我所知,CString类申请空间一次申请至少256字符,尽管字符串可能比这小,如果有两个100个字符的字符串,它们可能都占用这256空间,并不新申请内存;如果有一个字符串被析构了,那256空间也不销毁,直到空间内所有字符串都被析构为止。我想CArray也是这样。
而用delete()才能把指针指向的内容删除掉。
比如:a is a point 地址是0x0020 它的内容是一个地址 0x0030
b is a number 地址是0x0030 它的内容是5;
a是CArray 中的一个元素,当用a.ramovetAt()时,只是把a 的内容删除了,
也就是说 *a不再等于b了,但实际上,b中的内容并没有删除,
得用delete()
你的typedef行确实令人费解,能解释一下吗?
我一直都在用philiploo的方法。
按你说的,每次add()时,要先new,不然delete会出错的,删除时先getat(),removeat(),delete?不过我看书上add时并没有new,而直接加入对象,所以我还是同意horris的看法,你说呢?to dusj:
typedef CArray<CPoint,CPoint&> CPointArray;
CPointArray pointarray;
pointarray.add();
.....
这样就行了,把CPointArray当作类使用就行了
不管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().有详细说明。
写的简单了一点,不好意思。
一个问题:
pointarray.setsize(pointarray.getsize()+1);
pointarray.setat(GetUpperBound(),p );
这样能不能防止memory frag呢?(想法而已)
to dusj(小兔乖乖) & sunriselx() : typedef用的没有问题
有谁能帮我解答?分数可以再加!!!
有谁能帮我解答?分数可以再加!!!
不如这样:
pointarray.setsize(newsize, -1);
pointarray.setatgrow(index, p);
一切的increase都由MFC操心去吧。
我一次只想加一个,怎样做好一点呢?