MFC CPtrArray的用法

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();
相关推荐
Circ.3 分钟前
Python 调试 Litellm 本地大模型接口:模型列表与对话接口实操踩坑记录
开发语言·python
现任明教教主~2 小时前
Thinkphp站群蜘蛛池SaaS系统YanyvSEO含多用户/积分/六大引擎计费/易支付对接
java·开发语言·spring
Zhou1411362 小时前
SpringSecurity_02_授权与高级功能
开发语言·python
Cccp.1232 小时前
【leetcode】(七)前缀树和贪心算法
数据结构·leetcode·贪心算法
千里码aicood2 小时前
基于CART算法的图书分类系统设计与实现
数据库·算法·分类
码匠许师傅3 小时前
【C++三方组件】cpp-httplib:一个头文件起 HTTP 服务
开发语言·c++·http
做cv的小昊3 小时前
【World Model】π0.5:a Vision-Language-Action Model with Open-World Generalization
人工智能·算法·机器学习·大模型·多模态·vla·世界模型
لا معنى له3 小时前
World-In-World: World Models in a Closed-Loop World
算法
无名猿3 小时前
new/delete 与 malloc/free:为什么绝对不能混用
c++·内存管理·现代c++·踩坑记录