为了账号安全,请及时绑定邮箱和手机立即绑定

C ++中的堆栈或堆中的全局内存管理?

C ++中的堆栈或堆中的全局内存管理?

C++
不负相思意 2019-08-09 16:26:58
C ++中的堆栈或堆中的全局内存管理?如果我在C ++应用程序中全局声明数据结构,它是否会消耗堆栈内存或堆内存?例如struct AAA{.../.../.../../..}arr[59652323];
查看完整描述

3 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞


由于我对答案不满意,并希望同样的karjatkar想要学习的不仅仅是一个简单的是/否答案,在这里你走了。

通常,进程分配了5个不同的内存区域

  1. 代码 - 文本段

  2. 初始化数据 - 数据段

  3. 未初始化的数据 - bss段

如果您真的想学习保存的内容,请阅读并为这些书签添加书签:

编译器,装配器,链接器和装载器:简要介绍(见表w.5)

记忆中程序的剖析


查看完整回答
反对 回复 2019-08-09
?
当年话下

TA贡献1890条经验 获得超9个赞

这里的问题是问题。让我们假设你有一个很小的C(++也是,他们以相同的方式处理这个)程序,如下所示:


/* 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;

}

这既不在堆上的堆栈NOR上分配。相反,它被分配为静态数据,并在大多数现代机器上放入自己的内存段。实际的字符串也被分配为静态数据,并放入正确思考的机器中的只读段。

只是一个静态分配的指针; 静态数据中的一个地址空间。

具有在堆栈上分配的指针,并且在main返回时将被有效地释放。字符串,因为它是一个常量,在静态数据空间中与其他字符串一起分配。

实际上分配与2完全相同。static关键字告诉您它不会在堆栈上分配。

......但是buf1在堆栈上,并且

... malloc的缓冲区空间在堆上。

顺便说一下,孩子们不要在家里试试。  malloc具有感兴趣的回报值; 你应该经常检查返回值。

例如:


char * bfr;

if((bfr = malloc(SIZE)) == NULL){

   /* malloc failed OMG */

   exit(-1);

}


查看完整回答
反对 回复 2019-08-09
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

通常它既不消耗也不消耗。它尝试将它们分配在一个内存段中,该段可能保持为程序执行的常量。它可能是bss,堆栈,堆或数据。


查看完整回答
反对 回复 2019-08-09
  • 3 回答
  • 0 关注
  • 524 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信