CPtrArray 是MFC 自带的容器类 ,在 <afxcoll.h>,专门用来存放void * 裸指针。
和你刚才看同事手写的那个
CPtrArray目标一模一样,同事 2004 年就是模仿 MFC 这个类手写的简易版本。
功能
动态数组,数组里面每个元素存的是指针(void*),可以存任意 C++ 对象指针。
cpp
class CPtrArray : public CObject
{
//属性
public:
void* GetAt(int nIndex) const;
void SetAt(int nIndex, void* newElement);
int GetSize() const;
int GetUpperBound() const; //最大有效下标 = GetSize()-1
void SetSize(int nNewSize, int nGrowBy = -1);
//操作
public:
int Add(void* newElement); //尾部追加
void RemoveAt(int nIndex); //删除指定下标
void RemoveAll(); //清空数组
void InsertAt(int nIndex, void* newElement, int nCount = 1);
void SetAtGrow(int nIndex, void* newElement);
void* operator[](int nIndex) const;
};
核心关键点(非常重要)
✅MFC 的 CPtrArray 也只保存指针的值,不会 delete/free 你的业务对象! 它只管存放指针,不管指针指向的内存释放。销毁 CPtrArray、RemoveAll、RemoveAt,只会把指针变量擦掉,不会释放对象内存,需要你自己手动 delete 对象,否则内存泄漏。
简单示例
cpp
CPtrArray arr;
CMyClass* p1 = new CMyClass();
CMyClass* p2 = new CMyClass();
arr.Add(p1);
arr.Add(p2);
//读取
CMyClass* p = (CMyClass*)arr[0];
//删除元素:注意顺序!先释放对象,再RemoveAt
delete (CMyClass*)arr.GetAt(0);
arr.RemoveAt(0);
//全部清空
for(int i=0;i<arr.GetSize();i++)
{
delete arr.GetAt(i);
}
arr.RemoveAll();