简述C++中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中 ?
参考答案:
在C++中,数据的存储主要分为四个区域:栈(Stack)、堆(Heap)、全局/静态存储区(Global/Static Storage) 和代码区(Code Segment)。
- 栈(Stack): 栈主要用来存储局部变量和函数调用的信息。当函数被调用时,其参数和局部变量会被推送到栈上,当函数返回时,这些信息会被从栈中弹出。栈的存储空间是由编译器自动分配和释放的,因此速度很快,但是空间有限。
- 堆(Heap): 堆是用来动态分配内存的区域,比如使用
new
、malloc
等函数分配的内存就在堆上。堆上的内存分配和释放需要程序员手动管理,如果管理不当,可能会导致内存泄漏。堆的大小通常比栈大得多,但是分配和释放内存的速度相对较慢。
关于你提到的“近堆”和“远堆”,这并不是C++的标准概念。在某些操作系统或编译器中,可能会有这样的概念,但是在大多数情况下,我们只需要关心堆和栈的区别。
- 全局/静态存储区(Global/Static Storage): 全局变量和静态变量(包括全局静态变量和局部静态变量)都存储在这个区域。全局/静态存储区在程序开始运行时被创建,在程序结束时被销毁。
- 代码区(Code Segment): 存放程序的二进制代码。
在C++中,使用new
关键字分配的内存是在堆上的。new
运算符会向堆申请指定大小的内存,并返回指向这块内存的指针。如果申请成功,new
会返回指向被分配内存的指针,如果申请失败(例如,堆内存不足),new
会抛出一个bad_alloc
异常。
例如:
int* p = new int; // 在堆上分配一个int大小的内存
这里,p
是一个指向整数的指针,new int
在堆上分配了一个整数大小的内存,并返回这块内存的地址,这个地址被赋值给了p
。