Android_NDK C内存开辟
内存开辟
栈:占用内存空间大约2M,静态内存开辟,方法结束自动回收,栈虚拟机(jvm也是栈虚拟机,安卓虚拟机是寄存器虚拟机)
堆:占用内存空间最大值的80%,动态内存开辟,必须手动回收内存
void main(){
int arr[5];//静态开辟
//动态开辟
int* arr = (int*)malloc(10*1024*1024*sizeof(int))
//动态释放
free(arr)
//arr[i] = *(arr + i)
}
malloc返回的是 void*
内存开辟增加
realloc:增加内存的空间(重新开辟内存空间)
void main(){
//动态开辟
int* arr = (int*)malloc(10*1024*1024*sizeof(int))
//扩充newsize大小
int* newarr = (int*)realloc(arr,sizeof(int)*(oldsize+newsize))
if(newarr){
//不为空
}
//动态释放
if(newarr){
free(newarr)
}else{
free(arr)
}
//arr[i] = *(arr + i)
}
一般情况下,arr,newarr的地址是一样的。
1.对新的内存赋值,可以不对之前的内存赋值
2.如果连续内存不足,返回的地址不相同。就会先自动copy内存,释放原内存,然后返回新的头指针。
3.新增内存失败,返回NULL,默认情况下需要判空。
内存释放
不要反复释放,释放前判空等。