在堆栈/堆上创建对象

时间:2013-03-16 19:10:32

标签: c++

我有两段创建A对象的代码

A* a=new A();

A b; 
A *c=&b;

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

即使在堆栈上声明它也是如此吗?(代码1)

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

当它超出范围时被清除。但是当它仍在范围内时,

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

4 个答案:

答案 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;
}
  1. 这既未在堆上的堆栈NOR上分配。相反,它被分配为静态数据,并在大多数现代机器上放入自己的内存段。实际的字符串也被分配为静态数据,并放入正确思考的机器中的只读段。
  2. 只是一个静态的定位指针;一个地址的空间,静态数据。
  3. 堆栈上分配了指针,并在main返回时被有效解除分配。字符串,因为它是一个常量,在静态数据空间中与其他字符串一起分配。
  4. 实际上
  5. 的分配与2完全相同。static关键字告诉您它不会在堆栈中分配。
  6. ...但buf1在堆栈上,
  7. ...... malloc的缓冲区空间在堆上。
  8. 顺便说一下,孩子们不要在家里试试。 malloc具有感兴趣的回报值;你应该总是检查返回值。
  9. see here full Charlie Martin post

答案 3 :(得分:0)

就像在第二个片段中所示,可以在本地范围内创建对象(使用堆栈内存)。 第一个片段使用堆内存创建对象A.

凯文