内存是最基本的资源对一个进程。对于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关键字相应。失败的做这将导致不知道的应用程序的行为。