申请数组内存空间时做了哪些事情

本文详细介绍了申请数组时内存分配的过程及结构。通过_CrtMemBlockHeader结构体,记录了内存块的相关信息,如文件名、行号等。申请内存前后会附加额外的内存用于标识,确保内存操作的安全性。

申请数组时,除了分配申请的空间之外,还会分配一些空间存储和这块内存相关的信息

1、_CrtMemBlockHeader,放在申请的内存空间之前,包括两部分:[1]这块内存的相关信息。[2]申请内存之前连续4个字节,值为fd
typedef struct _CrtMemBlockHeader
{
// Pointer to the block allocated just before this one:
   struct _CrtMemBlockHeader *pBlockHeaderNext;
// Pointer to the block allocated just after this one:
   struct _CrtMemBlockHeader *pBlockHeaderPrev;
   char *szFileName;    // File name
   int nLine;                  // Line number
   size_t nDataSize;      // Size of user block
   int nBlockUse;         // Type of block
   long lRequest;          // Allocation number
// Buffer just before (lower than) the user's memory:
   unsigned char gap[nNoMansLandSize];
} _CrtMemBlockHeader;

2、紧跟申请内存之后连续4个字节,值为fd。

由此可见,申请一个数组后,分配的连续空间由3部分构成:头、申请的空间、尾。
这样我们申请的空间就被包在了中间,在释放空间时,首先会根据头尾两部分来判断是否越界。
释放时,会将头尾的空间一起释放掉。


 

### 三级标题:堆区动态申请数组内存的连续性分析 在堆区使用动态内存分配申请数组数组内存空间是否连续取决于具体的分配方式。如果使用 `malloc` 或 `calloc` 一次性申请足够大的连续空间,则数组内存空间是连续的。例如,在 `int* p = malloc(10 * sizeof(int));` 中,`p` 指向的是一块连续的内存空间,可以存储 10 个 `int` 类型的数据[^4]。 然而,在多维数组的动态分配中,如果采用嵌套的 `new` 或 `malloc` 逐层分配内存,则每一层的指针指向的空间可能不连续。例如在以下代码中: ```cpp void CreateArray(float****& data, int km, int jm, int im, int igm) { data = new float***[km]; for (int k = 0; k < km; ++k) { data[k] = new float**[jm]; for (int j = 0; j < jm; ++j) { data[k][j] = new float*[im]; for (int i = 0; i < im; ++i) { data[k][j][i] = new float[igm]; } } } } ``` 每一层的内存分配都是独立进行的,因此不同层级的数组元素在物理内存中可能不连续。这种分配方式虽然逻辑上是多维数组,但底层内存结构是分散的,可能导致 `memcpy` 等操作失败,因为它们假设内存是连续的[^2]。 为了确保多维数组的内存连续性,可以采用一次性分配整个数组空间的方式。例如,对于二维数组,可以先分配一个指针数组,再分配一块连续的数据空间,并将指针依次指向该空间的不同位置: ```cpp template<typename T> T** allocate2DArray(int rows, int cols) { T** arr = new T*[rows]; T* data = new T[rows * cols]; for (int i = 0; i < rows; i++) { arr[i] = data + i * cols; } return arr; } ``` 这种方式确保了数组元素在内存中的连续性,适用于需要高效访问和拷贝的场景[^3]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值