例如創建遊戲腳色時會需要用到記憶體,但是用完記憶體要回收 不然越來越大
C 語言的動態記憶體配置可以讓程式在需要使用到大量的記憶體時,動態的取得更多的記憶體空間,在使用完之後也可以將不再需要使用的記憶體釋出,也就是說它可以讓程式設計者自行管理記憶體的使用。
C 語言動態記憶體配置的相關函數位於 stdlib.h 這個 C 語言的標準函式庫中,以下是主要的幾個函數:
void *malloc(size_t size);
void *calloc(size_t nmemb, size_t size);
void free(void *ptr);
void *realloc(void *ptr, size_t size);
這幾個函數的功用如下:
malloc 函數
malloc 代表 memory allocation,用來配置指定大小的記憶體空間,傳回新空間第一個位元組的記憶體位址,配置的空間處於尚未初始化的狀態。
calloc 函數
calloc 代表 contiguous allocation,用來配置陣列用的記憶體空間,傳回新空間第一個位元組的記憶體位址,配置的空間會被初始化為 0。
free 函數
釋放之前使用 malloc 或 calloc 函數所配置的記憶體空間。
realloc 函數
改變已配置記憶體空間的大小。
這些函數的詳細說明,可以參考 malloc(3) 的 man page:
man 3 malloc
以下是一些 C 語言配置與管理記憶體的範例程式碼。
典型記憶體配置
/////////////////////////////////////////
甚麼時候用靜態記憶體 甚麼時候用動態記憶體?
假設變動很大 用動態
假設變動,但運行占空間大小只有1K之類的 用靜態
程式碼如下:
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include "main.h"
using namespace std;
#define Maxlength 1024
int main(int argc, char** argv)
{
char line[1024];
char * line2;
char ch;
int num1 = 0, num2 = 0, num3 = 0;
int remain = 0;
cout << "These enter a string:" << endl;
cin.getline(line,sizeof(line) );
int len = strlen(line);
cout << "len = " << len << endl;
// line2 = (char*) malloc(len + 1);
// line2 = (char*) calloc( (len + 1), sizeof(char) );
line2 = new char[len + 1];
if(line2 == NULL)
cout << "memory allocad fail." ;
// for(int z = 0; z < len +1; z++)
// printf("%x", line2[z]);
for(int i =0; i < len; i++)
{
line2[len - i - 1] = line[i];
}
line2[len+1] = '\0';
cout << line2 << endl;
cout << "line sizeof = " << sizeof(line) << endl ;
cout << "line2 sizeof = " << sizeof(line2) << endl ;
free(line2);
return 0;
}
產生結果如下:
沒有留言:
張貼留言