2019年3月11日 星期一

CMoney戰鬥營 第九天:動態記憶體

例如創建遊戲腳色時會需要用到記憶體,但是用完記憶體要回收 不然越來越大


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;
}

產生結果如下:


沒有留言:

張貼留言

Android Studio IDE 錯誤

 :app:compile xxxxx JavaWithJavac FAILED An exception has occurred in the compiler (1.8.0_312). Please file a bug against the Java compiler ...