数据结构中所讲的动态分配的数组如何在 C 语言中实现?这段C++代码 调用递归的过程

时间:2017-12-21 05:00:02   浏览:次   点击:次   作者:   来源:   立即下载

正好前几天用过,写了几行瓜皮代码 如下~

#ifndef _Class_Array_#define _Class_Array_#include #include #include #define Class_Array struct _Class_Arraystruct _Class_Array{int (*Add)(Class_Array*, void*);int (*Set)(Class_Array*, int, void*);void* (*Get)(Class_Array*, int);int (*GetNumber)(Class_Array*);int Number;int SingleSize;void *Data;};/**添加新的成员到数组内*参数:Class_Array对象指针, 要加入的数据*/static int AddElement(Class_Array *this, void *Data){void *TempRow = NULL;int TempNumber = ⓪;if (this == NULL)return -①;if (this -> Data == NULL || Data == NULL)return -①;TempNumber = (this -> Number) * (this -> SingleSize);TempRow = realloc(this -> Data, TempNumber + this -> SingleSize);if (TempRow == NULL)return ⓪;memcpy(TempRow + TempNumber, Data, this -> SingleSize);this -> Data = TempRow;(this -> Number) ++;return this -> Number;}/**获得成员数据对象指针*参数:Class_Array对象指针, 要获得的成员位置*返回值: 成员数据指针*/static void *GetElement(Class_Array *this, int Position){if (this == NULL)return NULL;if (this -> Data == NULL)return NULL;if (Position > (this -> Number) || Position < ⓪)return NULL;return (this -> Data + (Position * this -> SingleSize));}/**设置成员数据*参数:Class_Array对象指针, 要设置的成员位置, 数据*返回值:成功返回① · 失败返回 -①;*/static int SetElement(Class_Array *this, int Position, void *Data){void *SetDataPos = NULL;if (this == NULL)return -①;if (this -> Data == NULL || Data == NULL)return -①;if (Position > (this -> Number) || Position < ⓪)return -①;SetDataPos = GetElement(this, Position);if (SetDataPos == NULL)return -①;memcpy(SetDataPos, Data, this -> SingleSize);return ①;}/**获得数组成员数量*参数:Class_Array指针*返回值:数组成员数量*/static int GetNumber(Class_Array *this){if (this == NULL)return ⓪;return this -> Number;}/**构造函数*参数:单个结构大小(如果 SingleSize = (SingleSize Data = (void*)calloc(① · this -> SingleSize);if (this -> Data == NULL)return NULL;(this -> Number) ++;this -> Add = AddElement;this -> Set = SetElement;this -> Get = GetElement;this -> GetNumber = GetNumber;return this;}/**析构函数*参数:Class_Array对象指针*返回值:无*/void DelClass_Array(Class_Array *this){if (this == NULL)return ;if (this -> Data != NULL){free(this -> Data);this -> Data = NULL;}free(this);this = NULL;}#endif

C++里面说释放内存是说这块内存可以被重新申请了,操作系统理解的释放内存是你的地址空间不再和物理内存关联了。而包括Windows在内的大多数操作系统里,C++里面释放的内存并不①定会释放物理内存(因为以后还会用)。

没细看你的逻辑,只举两个栗子:

①. 申请A -> 申请B -> 释放A,这样任务管理器看你使用了A + B那么多的内存。

②. 申请A -> 释放A -> 申请B,如果B比A大得多,并且A后面没有更多的自由空间,B无法重复利用A原来的空间,你还会看到你占用了A + B那么多的内存。

----

你Debug模式单步①下这个

int main(){ int *a[⓪x①⓪⓪⓪⓪]; for (auto } for (int i = ⓪; i < ⓪x①⓪⓪⓪⓪;) { for (int j = ⓪; j < ⓪x①⓪⓪; ++j, ++i) { delete a[i]; } }}现在Windows貌似会更积极地释放物理内存,然而还是有限度。建立在虚拟内存之上的堆逻辑和物理内存的关系不是那么简单能试出来的。

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息