我有两段代码创建一个 A 对象
A* a=new A();
和
A b;
A *c=&b;
问题是:有人说“对象总是在堆上分配”?
甚至在堆栈上声明它是真的吗?(代码1)
注意:我指的是实际的内存分配。我知道对象'b'将是
当它超出范围时清除。但是当它还在范围内时,它在哪里
'b'的记忆真的存在吗?
我有两段代码创建一个 A 对象
A* a=new A();
和
A b;
A *c=&b;
问题是:有人说“对象总是在堆上分配”?
甚至在堆栈上声明它是真的吗?(代码1)
注意:我指的是实际的内存分配。我知道对象'b'将是
当它超出范围时清除。但是当它还在范围内时,它在哪里
'b'的记忆真的存在吗?
指针a
在堆栈上,A
它指向的实例在堆上。
对象b
在栈上,指针c
在栈上。
作为一般经验法则:
如果您使用任何类型的动态内存分配(new、array new、malloc 等),分配的对象将位于堆上。否则,它被压入堆栈。
@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
具有感兴趣的返回值;您应该始终检查返回值。正如您在第二个片段中显示的那样,绝对可以在本地范围内创建对象(使用堆栈内存)。
第一个片段使用堆内存创建对象 A。
凯文