我有两段创建A对象的代码
A* a=new A();
和
A b;
A *c=&b;
问题是:有人说“对象总是在堆上分配”?
即使在堆栈上声明它也是如此吗?(代码1)
注意:我指的是实际的内存分配。我知道对象'b'将是
当它超出范围时被清除。但是当它仍在范围内时,
在哪里 'b'的记忆真的存在吗?答案 0 :(得分:2)
指针a
在堆栈上,它指向的A
实例在堆上。
对象b
在堆栈上,指针c
在堆栈上。
答案 1 :(得分:1)
作为一般经验法则:
如果使用任何类型的动态内存分配(new,array new,malloc等),分配的对象将位于堆上。否则,它会被推到堆栈上。
答案 2 :(得分:1)
@LouisTan它取决于这些代码行在程序中的位置。但一般来说,这个指针将在Stack上。
比较一下:
/* my.c */
char * str = "Your dog has fleas."; /* 1 */
char * buf0 ; /* 2 */
int main(){
char * str2 = "Don't make fun of my dog." ; /* 3 */
static char * str3 = str; /* 4 */
char * buf1 ; /* 5 */
buf0 = malloc(BUFSIZ); /* 6 */
buf1 = malloc(BUFSIZ); /* 7 */
return 0;
}
main
返回时被有效解除分配。字符串,因为它是一个常量,在静态数据空间中与其他字符串一起分配。static
关键字告诉您它不会在堆栈中分配。buf1
在堆栈上,malloc
具有感兴趣的回报值;你应该总是检查返回值。答案 3 :(得分:0)
就像在第二个片段中所示,可以在本地范围内创建对象(使用堆栈内存)。 第一个片段使用堆内存创建对象A.
凯文