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();
相关推荐
白杨尚青1 小时前
C++进阶篇(二):多态——虚函数、重写、虚函数表与三个经典坑(附完整代码仓库)
开发语言·c++·多态·虚函数·重写·动态绑定
syagain_zsx1 小时前
spdlog实战:日志分级、滚动与性能调优
linux·c++·日志库·二次开发日志库
zyl76515 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
爱读书的小胖19 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌19 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
WJ.Polar19 小时前
Java封装、继承、多态
java·开发语言
摇滚侠19 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
OPEN-F19 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_3077791319 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
AI wins19 小时前
c++新增頭文件
c++