在C / Java中堆栈vs堆
这是我的理解。
在C编程中,如果我做int a
那么在堆栈上创建a
,从而从栈中获取内存。 堆在这里不起作用。
但是,如果我做了类似的事情
int *a;
a=(int*)malloc(sizeof(int));
并动态分配内存,那么引用变量将被放置在堆栈上,但它指向的内存将位于堆上。
我的理解是否正确?
现在,我拿起了关于java的这本书
无论何时你需要一个对象,你只需编写代码来使用new来创建它,并且在代码执行时将存储分配到堆上。
所以没有办法在Stack中创建Java对象?
我想,原始数据类型仍然可以放在堆栈上,但我关心的是对象。
在Java中无法在堆栈中创建对象。 Java也有自动垃圾收集功能,所以你没有任何删除对象的方法。 你只是让所有对它们的引用超出范围,最终垃圾收集器会处理它们。
那是对的。 对象存储在堆上。 堆栈包含像int
和double
(来自局部变量)和对象引用(再次来自局部变量)等原始值。
您的问题的整个前提是错误的:在Java中,您无法控制对象的分配位置。 有些确实是堆栈分配的,但你永远不会注意到这种差异。
Java和C之间根本不同的是,在Java中,变量的值永远不会是对象本身,而在C中,值可以是struct
本身,而不是间接的。 您可以将这些结构按值传递给其他函数,并且在Java中没有相同的结果。