跳到主要内容

简述C++中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中 ?

参考答案:

在C++中,数据的存储主要分为四个区域:栈(Stack)、堆(Heap)、全局/静态存储区(Global/Static Storage) 和代码区(Code Segment)。

  1. 栈(Stack): 栈主要用来存储局部变量和函数调用的信息。当函数被调用时,其参数和局部变量会被推送到栈上,当函数返回时,这些信息会被从栈中弹出。栈的存储空间是由编译器自动分配和释放的,因此速度很快,但是空间有限。
  2. 堆(Heap): 堆是用来动态分配内存的区域,比如使用newmalloc等函数分配的内存就在堆上。堆上的内存分配和释放需要程序员手动管理,如果管理不当,可能会导致内存泄漏。堆的大小通常比栈大得多,但是分配和释放内存的速度相对较慢。

关于你提到的“近堆”和“远堆”,这并不是C++的标准概念。在某些操作系统或编译器中,可能会有这样的概念,但是在大多数情况下,我们只需要关心堆和栈的区别。

  1. 全局/静态存储区(Global/Static Storage): 全局变量和静态变量(包括全局静态变量和局部静态变量)都存储在这个区域。全局/静态存储区在程序开始运行时被创建,在程序结束时被销毁。
  2. 代码区(Code Segment): 存放程序的二进制代码。

在C++中,使用new关键字分配的内存是在堆上的。new运算符会向堆申请指定大小的内存,并返回指向这块内存的指针。如果申请成功,new会返回指向被分配内存的指针,如果申请失败(例如,堆内存不足),new会抛出一个bad_alloc异常。

例如:

int* p = new int;  // 在堆上分配一个int大小的内存

这里,p是一个指向整数的指针,new int在堆上分配了一个整数大小的内存,并返回这块内存的地址,这个地址被赋值给了p