API内存操作
內存是最基本的資源對一個進程。對于Java應用程序,這內存由虛擬機管理。內存作為新的對象被創建,和通過垃圾回收機制,這沒有用的內存比自動的返回給系統。然而,在原生的空間,應用程序被期望自己明確的管理他們自己的內存。在原生應用程序開發中恰當的管理內存是重要的,因為管理內存失敗可能耗盡系統的資源和影響系統的穩定性。
內存分配:
被C/C++編程語言支持的有三種內存分配的方法。
靜態分配:對于每個定義在代碼中的,每個靜態和全局變量,靜態分配自動進行當應用程序開始時。
自動分配:對于每個函數的參數和局部變量,自動分配方式當這混合的語句包含進入當退出時自動釋放。
? ? ? ?動態分配:靜態和自動分配假定需要的內存尺寸和它的范圍是固定的和在編譯時被定義。動態分配起作用當內存分配的尺寸和范圍是取決于在運行時的因素時,并沒有被提前知道。
? ?在C編程語言,動態分配內存使用如下標準C庫函數malloc;
? ? void* malloc(siez_t size);
? ?為了使用這個功能,這個stdlib.h標準C庫頭文件應該首先被導入。正如列表,malloc取了了一個單一的參數,內存的分配使用字節的數量,和返回一個分配內存的指針。
? ?/* Include standard C library header. */
? ?#include < stdlib.h>
? ?...
? /* Allocate an integer array of 16 elements. */
? int* dynamicIntArray = (int*) malloc(sizeof(int) * 16);
? if (NULL == dynamicIntArray) {
? /* Unable to allocate enough memory. */
? ? ? ...
? ? } else {
? ? ? ? ?/* Use the memory through the integer pointer. */
? ? ? ? ? *dynamicIntArray = 0;
? ? ? ?dynamicIntArray[8] = 8;
? ? ?/* Free the memory allocation. */
? ? ? free(dynamicIntArray);
? ? ? dynamicIntArray = NULL;
? ?}
釋放動態內存:
? ?當它不在需要時,動態內存應該有應用程序動態的釋放。這個標準的C庫函數free被用來釋放動態的內存。
? void free(void* memory);
?這free函數取用一個指針是先前分配的動態內存和釋放它,如下:
? ?int* dynamicIntArray = (int*) malloc(sizeof(int) * 16);
...
/* Use the allocated memory. */
...
free(dynamicIntArray);
dynamicIntArray = NULL;
注意這個指針的值并不會改變在這個函數掉用后,盡管內存已經被釋放。任何試圖使用這個無效的指針導致沖突。它是一個很好的習慣設置指針為空在釋放后為了阻止偶然的使用這個無效的指針。
? ?改變動態分配的指針
? ?一旦內存被分配,它的尺寸能夠被改變通過這個realloc函數被提供這個標準C庫。
? void* realloc(void* memory,size_t size);
? 動態內存分配的尺寸得到擴展或者基于他的新尺寸的減少。這個realloc函數去這個原始動態內存分配作為它的第一個參數和新的尺寸作為第二個參數,如下:
? ?int* newDynamicIntArray = (int*) realloc(
dynamicIntArray, sizeof(int) * 32);
if (NULL == newDynamicIntArray) {
/* Unable to reallocate enough memory. */
...
} else {
/* Update the memory pointer. */
dynamicIntArray = newDynamicIntArray;
...
?realloc函數返回這個新分配內存的指針。這個函數可能返回NULL。
使用C++分配內存:
??int* dynamicInt = new int;
if (NULL == dynamicInt) {
/* Unable to allocate enough memory. */
...
} else {
/* Use the allocated memory. */
*dynamicInt = 0;
...
}
如果元素數組需要被分配,這元素的數量被指定使用括號。
?int* dynamicIntArray = new int[16];
if (NULL == dynamicIntArray) {
/* Unable to allocate enough memory. */
...
} else {
/* Use the allocated memory. */
dynamicIntArray[8] = 8;
...
}
釋放動態的內存用C++
動態內存被明確的釋放使用C++ ?delete關鍵字由應用程序當它不在被需要,如下:
? ?delete dynamicInt;
? dynamicInt = 0;
如果元素數組被釋放,這個C++釋放[] 關鍵字應該被使用,如下:
delete[] dynamicIntArray;
dynamicIntArray = 0;
改變動態內存分配使用C++
這個C++編程語言沒有內建支持對于重新分配內存。這個內存分配被做基于數據類型的尺寸和元素的數量。如果這個應用程序邏輯需要增加和減少元素的數量,它被推薦使用合適的標準模板(STL)容器類。
混合這個內存函數和關鍵值
? 開發者必須使用恰當的函數和關鍵字對,當處理這動態內存。內存塊被分配通過malloc必須通過free關鍵釋放;否則,內存塊被分配通過new的關鍵字必須被釋放帶有delete關鍵字相應。失敗的做這將導致不知道的應用程序的行為。
??
總結
- 上一篇: 新的C库Bionic的介绍
- 下一篇: 文件I/0