轻量高效的动态指针数组CPtrArray实现

张开发
2026/4/10 7:47:32 15 分钟阅读

分享文章

轻量高效的动态指针数组CPtrArray实现
在C开发中动态管理指针集合是常见需求今天分享一款轻量、高效的动态指针数组类CPtrArray其核心作用是统一管理任意类型指针的存储、删除、访问适配单线程下的各类指针管理场景代码简洁且实用性强。CPtrArray采用动态扩容机制默认扩容步长为1024既避免了频繁扩容的性能损耗也减少了内存浪费。构造函数初始化空数组析构函数通过MemFree方法释放内存有效防止内存泄漏确保资源正常回收。核心接口涵盖Append/Add添加元素、DeleteAt/RemoveAt删除元素、GetAt获取元素、SetAt修改元素还有下标运算符重载GetData()使用起来简洁便捷。特别优化了删除逻辑避免内存越界清空末尾指针防止野指针细节处理到位。该类设计简洁无多余冗余代码仅聚焦指针管理核心需求适用于单线程环境下的指针集合管理比如各类对象指针的批量存储与操作是项目开发中一款实用的工具类值得借鉴和直接复用。#if !defined( _PTRARRAY_H ) #define _PTRARRAY_H #include datadef.h // 指针存储节点保存任意类型数据指针 typedef struct { void* m_pObj; // 数据指针 }ST_OBJ; // 动态指针数组管理 void* 指针的动态数组 class CPtrArray { public: CPtrArray( ); // 构造函数 virtual ~CPtrArray( ); // 析构函数 public: void* SetAt(int nIndex, void* pObj); // 修改指定索引元素 int GetCount( ); // 获取有效元素个数 int Append( void* pObj ); // 追加元素自动扩容 int DeleteAt( int nIndex ); // 删除指定索引元素 int RemoveAt(int nIndex) ; // 删除元素别名 void* GetAt( int nIndex ); // 获取指定索引元素 int RemoveAll( ); // 清空所有元素释放内存 int GetSize( ); // 获取元素个数同GetCount int Add( void* pObj ); // 添加元素别名 void* operator []( int nIndex ); // 下标重载 ST_OBJ* GetData(); // 获取数组内存首地址用于排序等 protected: static const int MAXPRESIZE; // 扩容步长 int m_nCount; // 有效元素数量 int m_nMaxSize; // 数组总容量 ST_OBJ* m_pData; // 数据内存指针 private: int MemFree( ); // 内部内存释放 }; #endif /************************************************************************** FILE: PtrArray.CPP Description: 动态指针数组实现用于管理任意类型指针的存储、删除、访问 **************************************************************************/ #include string.h #include stdio.h #include ptrarray.h #include malloc.h // 扩容步长定义 const int CPtrArray::MAXPRESIZE 1024; // 构造函数初始化空数组 CPtrArray::CPtrArray( ) { m_nMaxSize 0; m_pData NULL; m_nCount 0 ; } // 析构函数释放所有内存 CPtrArray::~CPtrArray() { MemFree( ); } // 释放数组内存重置状态 int CPtrArray::MemFree( ) { if(m_pData) { free( m_pData); m_pData NULL; } m_nMaxSize 0; m_nCount 0 ; return 0; } // 获取有效元素个数 int CPtrArray::GetCount( ) { return m_nCount; } // 清空数组释放内存 int CPtrArray::RemoveAll( ) { MemFree(); return 0; } // 追加元素到数组末尾自动扩容 int CPtrArray::Append( void* pObjAdd ) { ST_OBJ* pObj m_pData; if (!pObjAdd) return -1; // 容量不足自动扩容 if (m_nCount 1 m_nMaxSize) { m_nMaxSize MAXPRESIZE; ST_OBJ* pNew (ST_OBJ*)malloc(sizeof(ST_OBJ)*(m_nMaxSize)); if (pNew NULL) { m_nMaxSize - MAXPRESIZE; return -1; } // 拷贝旧数据 if(pObj) { memmove(pNew, pObj, sizeof(ST_OBJ)*(m_nCount)); free(pObj); pObjNULL; } m_pData pNew; } // 添加新元素 m_pData[m_nCount].m_pObj pObjAdd; m_nCount; return m_nCount; } // 删除指定索引元素后面元素前移 int CPtrArray::DeleteAt( int nIndex ) { if (nIndex 0 || nIndex m_nCount) return -1; // 元素前移覆盖 if (nIndex ! m_nCount - 1) { memmove(m_pData[nIndex], m_pData[nIndex 1], sizeof(ST_OBJ)*(m_nCount - nIndex-1)); } // 清空末尾指针避免野指针 m_pData[m_nCount-1].m_pObj NULL; m_nCount--; return m_nCount; } // 获取指定索引的指针 void* CPtrArray::GetAt( int nIndex ) { if (nIndex 0 || nIndex m_nCount) return NULL; return m_pData[nIndex].m_pObj; } // 修改指定索引的指针 void* CPtrArray::SetAt(int nIndex, void *pTagObj) { if (nIndex 0 || nIndex m_nCount) return NULL; m_pData[nIndex].m_pObj pTagObj; return m_pData[nIndex].m_pObj; } // 下标运算符重载 void* CPtrArray::operator []( int nIndex ) { return GetAt(nIndex); } // 删除元素别名函数 int CPtrArray::RemoveAt(int nIndex) { return DeleteAt(nIndex); } // 获取数组大小同GetCount int CPtrArray::GetSize( ) { return GetCount(); } // 添加元素别名函数 int CPtrArray::Add( void* pObj ) { return Append(pObj); } // 获取数据指针 ST_OBJ* GetData() { return m_pData; }

更多文章