首页 > 试题广场 >

下面这个 C++spa

[单选题]
下面这个 C++ 进程运行时,描述正确的是()
#include <iostream>
using namespace std;
int a = 1;
const char* str = "abc";
class Obj {};
int f(int lhs, int rhs) {
    Obj* obj = new Obj();
    Obj obj2;
    int aa = a;
    delete obj;
    return aa + lhs + rhs;
}

int main() {
    int *b = new int(2);
    int c = f(a, *b);
    delete b;
    return 0;
}



  • 保存在堆中的数据有:*b,*obj;保存在栈中的数据有:c,lhs,rhs,obj2,aa
  • 保存在堆中的数据有:*b,*obj;保存在栈中的数据有:str,c,lhs,rhs,obj2,aa
  • 保存在堆中的数据有:*b,*obj2;保存在栈中的数据有:c,lhs,rhs,obj,aa
  • 保存在堆中的数据有:*b,*obj,*str;保存在栈中的数据有:c,lhs,rhs, aa

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态 存储区和常量存储区。       

栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量 的存储区。里面的变量通常是局部变量、函数参数等。      

堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应 用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉, 那么在程序结束后,操作系统会自动回收。      

自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的, 不过它是用free来结束自己的生命的。      

全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的 C语言中,全局变量又分为初始化的和未初始化的(初始化的全局变量和静态变 量在一块区域,未初始化的全局变量与静态变量在相邻的另一块区域,同时未被 初始化的对象存储区可以通过void*来访问和操纵,程序结束后由系统自行释 放),在C++里面没有这个区分了,他们共同占用同一块内存区。      

常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许 修改(当然,你要通过非正当手段也可以修改,而且方法很多)

编辑于 2017-07-26 16:27:02 回复(5)
a是全局变量,放在全局区
*str是常量字符串放在文字常量区,str指针放在全局区
*b和*obj对象都是new出来的,放在堆区,指针b和obj放在栈区
c,obj2,aa是局部变量,lhs和rhs是函数参数值,都放在栈区

编辑于 2017-07-29 19:29:35 回复(0)
一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。程序结束时由编译器自动释放。 2、堆区(heap) — 在内存开辟另一块存储区域。一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事。用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上 3、全局区(静态区)(static)—编译器编译时即分配内存。全局变量和静态变量的存储是放在一块的。对于C语言初始化的全局变量和静态变量在一块区域.data, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域.bss。而C++则没有这个区别 - 程序结束后由系统释放 4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放函数体的二进制代码。
编辑于 2017-12-06 16:24:05 回复(1)

*str在常量区 str指针在全局区


发表于 2019-11-06 11:38:09 回复(0)
在C++中,内存分成5个区,他们分别是堆、栈、程序代码区、全局/静态 存储区和常量存储区。 栈,由编译器自动分配和释放。一般函数体中定义的变量通常在栈上,如数组,指针。 堆,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。 程序代码区—存放函数体的二进制代码。 全局区(静态区),在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。 常量存储区,存放常量,字符串也放在常量区。 比如:  int a = 0; 全局初始化区  char *p1; 全局未初始化区  main()  {  int b; 栈  char s[] = “abc “;栈  char *p2; 栈  char *p3 = “123456 “; 123456\0在常量区,p3在栈上。  static int c =0; 全局(静态)初始化区  p1 = (char *)malloc(10);  p2 = (char*)malloc(20);  分配得来得10和20字节的区域就在堆区。  strcpy(p1, “123456 “); 123456\0放在常量区,编译器可能会将它与p3所指向的 “12345  6 “优化成一块。  }
编辑于 2019-05-08 11:09:32 回复(1)
a是全局变量,放在全局区。
*str是字符串常量放在文字常量区,也就是全局区。
*obj和*b都是new出来的,放在堆区,指针obj和b放在栈区。
局部变量laa,obj2、c都是局部变量,rhs和lhs是函数的参数值,放在栈区。
编辑于 2018-03-29 19:44:02 回复(0)
a是全局变量,放在全局区 *str是常量字符串放在文字常量区,str指针放在全局区 *b和*obj对象都是new出来的,放在堆区,指针b和obj放在栈区 c,obj2,aa是局部变量,lhs和rhs是函数参数值,都放在栈区
发表于 2019-03-15 12:08:58 回复(0)
*str存储在常量区,而不是堆区。
发表于 2024-03-06 15:28:54 回复(0)
a,str放在全局区
发表于 2023-11-11 20:22:39 回复(0)
静态/全局区 堆区 栈区 str,a放在全局区, *str放在常量区 堆区放new出来的变量 栈区放 局部变量区 由系统自动分配内存
发表于 2019-12-19 16:09:32 回复(0)

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。

数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。

代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)

栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进后出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

发表于 2019-03-10 13:41:05 回复(0)

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态 存储区和常量存储区。
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量 的存储区。里面的变量通常是局部变量、函数参数等。
就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应 用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉, 那么在程序结束后,操作系统会自动回收。
自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的, 不过它是用free来结束自己的生命的。
全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的 C语言中,全局变量又分为初始化的和未初始化的(初始化的全局变量和静态变 量在一块区域,未初始化的全局变量与静态变量在相邻的另一块区域,同时未被 初始化的对象存储区可以通过void*来访问和操纵,程序结束后由系统自行释 放),在C++里面没有这个区分了,他们共同占用同一块内存区。
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许 修改(当然,你要通过非正当手段也可以修改,而且方法很多)

编辑于 2019-03-05 10:25:03 回复(0)
new分配的内存在堆上,局部变量在栈区,按照这个做题就可以了
发表于 2018-06-28 22:24:27 回复(0)
在c和c++中,经常需要操作的内存可以分为以下几个类别:
栈去(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值(包括局部常量),也就是c、lhs、rhs、obj2、aa
堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回首,也就是*b,*obj
全局区/静态变量区:也叫数据段,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量放在相邻的另一块区域,也就是bss段。也就是a
代码段:存放函数体的二进制代码,全局常量,字符串常量。也就是“abc",*str,有时候也会把全局常量和字符串常量叫做文字常量区。



发表于 2017-08-11 16:31:17 回复(0)
实际上并不存在常量存储区,只有全局/静态存储区。 const 类型的存储跟一般的变量没有区别,在外部定义的存储在全局数据区,static的存储在静态数据区,在函数内部定义的存储在栈, const 跟非 const 存储上没区别,只 过是read only的

发表于 2017-07-05 15:50:08 回复(0)
不用new声明的局部变量放在栈区对吗
发表于 2017-05-16 21:28:06 回复(0)
指针向量obj和b也存在栈区,只不过开辟的空间在堆区。答案好像都不是太贴切。
发表于 2017-01-04 19:36:36 回复(0)