-1

我有两段代码创建一个 A 对象

A* a=new A();

A b; 
A *c=&b;

问题是:有人说“对象总是在堆上分配”?

甚至在堆栈上声明它是真的吗?(代码1)

注意:我指的是实际的内存分配。我知道对象'b'将是

当它超出范围时清除。但是当它还在范围内时,它在哪里

'b'的记忆真的存在吗?

4

4 回答 4

2

指针a在堆栈上,A它指向的实例在堆上。

对象b在栈上,指针c在栈上。

于 2013-03-16T19:13:05.317 回答
1

作为一般经验法则:

如果您使用任何类型的动态内存分配(new、array new、malloc 等),分配的对象将位于堆上。否则,它被压入堆栈。

于 2013-03-16T19:15:24.677 回答
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;
}
  1. 这既不是在堆栈上分配,也不是在堆上分配。相反,它被分配为静态数据,并在大多数现代机器上放入它自己的内存段。实际的字符串也被分配为静态数据,并放入正确思考机器中的只读段中。
  2. 只是一个静态分配的指针;一个地址的空间,在静态数据中。
  3. 堆栈上分配了指针,并且在返回时将被有效地释放main。字符串,因为它是一个常量,所以与其他字符串一起分配在静态数据空间中。
  4. 实际上分配与 2 完全相同。static关键字告诉您它不分配在堆栈上。
  5. ...但buf1在堆栈上,并且
  6. ... malloc 的缓冲区空间在堆上。
  7. 顺便说一句,孩子们不要在家里尝试这个。 malloc具有感兴趣的返回值;您应该始终检查返回值。

看这里完整的查理马丁帖子

于 2013-03-16T19:18:01.087 回答
0

正如您在第二个片段中显示的那样,绝对可以在本地范围内创建对象(使用堆栈内存)。
第一个片段使用堆内存创建对象 A。

凯文

于 2013-03-16T19:15:58.777 回答