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();
相关推荐
梦里寻码7 分钟前
我用 NestJS + Vue3 写了一套完整的研发管理系统(58 表 / 229 API / 130 项断言,全开源
前端·后端·算法
FRing039 分钟前
vue2干货总结8(路由模块封装、router-link、声明式导航、路由重定向、编程式导航)
开发语言·前端·vue.js·vue2
旖旎夜光11 分钟前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习
猿人谷30 分钟前
Surrogate Model:让进化算法学会“预测”,为什么它正在成为智能优化的重要技术?
后端·算法·架构
starzy199032 分钟前
深入理解Scala嵌套函数:作用域封装之道
开发语言·scala
Sakura_j_h_41 分钟前
从零写一个 MCP stdio Server:用 Python 校验博客文章格式
开发语言·python·自动化·ai工具·mcp·json-rpc
青少儿编程课堂2 小时前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛
白杨尚青2 小时前
C++进阶篇(五):红黑树——四条规则、三种插入情况与旋转变色
开发语言·数据结构·c++·stl·红黑树·平衡二叉树
.道阻且长.2 小时前
Linux基本开发工具:gdb和cgdb的使用
linux·运维·服务器·开发语言