在堆栈/堆上创建对象

creating object on stack/heap

本文关键字:创建对象 堆栈      更新时间:2023-10-16

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

A* a=new A();

A b; 
A *c=&b;

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

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

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

在超出作用域时被清除。但是当

仍然在作用域中时, 在哪里?

内存'b'实际上驻留?

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

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

@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'ed buffer space在堆上
  7. 顺便说一下。孩子们不会在家里尝试这个。malloc具有感兴趣的返回值;总是检查返回值。

查看这里完整的Charlie Martin post

作为一般的经验法则:

如果您使用任何类型的动态内存分配(new, array new, malloc等),分配的对象将位于堆上。

在局部范围内(使用堆栈内存)创建对象是完全可能的,正如您在第二个代码片段中所示。
第一个代码片段使用堆内存创建对象A。

凯文