我有一个类似数组的声明
int a1[5];
如果我这样声明此数组:
int *a2;
a2 = malloc(sizeof(int)*5);
,然后像使用数组a1一样使用它,有什么区别。同样,如果这是在函数中完成的,并且函数结尾a1和a2都超出范围。如果是a1,内存会自动释放,但是如果是a2,内存会自动释放,还是我们必须使用delete来取消分配内存?
答案 0 :(得分:2)
RecyclerView
的内存不会自动释放。您始终可以遵循一条简单的经验法则-如果使用a2
进行分配,则需要使用malloc
进行分配。
答案 1 :(得分:2)
写作时
int a[10];
您说
“为我分配10个内存块,每个内存块可以存储一个整数 值”。
默认情况下,当将此定义放在块中(由{
和}
包围的代码部分)时,不能在块外部使用变量。
为什么?假设程序正在块内执行指令,并且遇到了这个定义。它分配一些内存来存储变量a。当程序发现它已到达块的末尾时,它将破坏它在该块中时分配的整个内存。因此,当您在右括号(}
)之后引用in代码时,由于内存被破坏,它不知道a是什么。
另一方面,当你写
int* a = (int*) malloc(10*(sizeof(int)));
您说
”为我分配10个特殊内存块,每个内存块可以存储一个 整数值”
。这种特殊的内存称为堆内存。之所以特别是因为它存在于一个从未被破坏过的新地方(除非您要求这样做)。因此,您甚至可以在块外访问它。