MFC CPtrArray的用法

CPtrArrayMFC 自带的容器类 ,在 <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();
相关推荐
佳児素花痴╮1 小时前
C++基础速通
开发语言·c++
weixin_446260851 小时前
CABAL:用于追踪同行评审中合谋投标影响的多智能体仿真框架
人工智能·算法·机器学习
不会就选b1 小时前
算法日常・每日刷题--<贪心>6
数据结构·算法·leetcode
是立不是利1 小时前
深入理解JavaScript事件委托
开发语言·前端·javascript
啊阿狸不会拉杆1 小时前
《计算机网络-自顶向下方法》6.4 交换局域网 读书笔记
开发语言·计算机网络·php
心中有你02141 小时前
Python Tkinter 情侣恋爱日记桌面小程序(本地文件存储,无数据库)
开发语言·python
青山木2 小时前
Hot 100 --- 跳跃游戏 II
java·数据结构·算法·leetcode·贪心算法
Tisfy2 小时前
LeetCode 3870.统计范围内的逗号:模拟 或 一步计算
数学·算法·leetcode·题解·模拟·遍历
明月_清风2 小时前
字符串匹配四大经典算法:BF、RK、BM、KMP 到底有什么区别?
后端·算法