什么职位做网站,怎么修改wordpress绑定的域名,建设通网站不良信用信息撤销,洛阳网站开发目录 一、内存分区模型二、内存分区代码示例三、new 运算符详解 一、内存分区模型
C程序在运行时#xff0c;将内存分为四个区域#xff0c;不同的区域赋予不同的生命周期#xff0c;以提供强大的灵活编程。 代码区#xff1a;存储程序的二进制代码#xff0c;通常是只读… 目录 一、内存分区模型二、内存分区代码示例三、new 运算符详解 一、内存分区模型
C程序在运行时将内存分为四个区域不同的区域赋予不同的生命周期以提供强大的灵活编程。 代码区存储程序的二进制代码通常是只读的以防止程序意外修改自身的指令且是共享的以减少内存消耗。 全局区存储全局变量、静态变量和常量包括已初始化和未初始化的数据。该区域中的数据在程序运行期间一直存在结束后由操作系统回收。 堆区由程序员手动分配和释放内存。可以使用 new 运算符在堆区分配内存使用 delete 运算符释放内存。堆区中的数据生命周期由程序员控制若程序员不释放则在程序结束时由操作系统回收。 栈区由编译器自动分配和释放内存用于存储局部变量和函数调用时的参数栈区中的数据生命周期与函数调用相关。
二、内存分区代码示例
#include iostream
using namespace std;// 全局变量存储在全局区
int g_var 10;// 静态变量存储在全局区
static int s_var 20;// 字符串常量存储在全局区
const char *str Hello, world!;// 常量变量存储在全局区
const int c_var 30;// 函数存储在代码区
void func() {// 局部变量存储在栈区int a 10;// 动态分配内存存储在堆区int *p new int;*p 20;cout a: a endl;cout *p: *p endl;// 释放动态分配的内存delete p;
}int main() {// 调用函数func();return 0;
}
在上面的代码中当程序开始运行时操作系统会为程序分配内存空间。其中代码区用于存储程序的二进制代码全局区用于存储全局变量、静态变量和常量堆区和栈区初始为空。
当程序进入 main 函数时栈区会分配一些空间用于存储函数调用时的参数和返回地址。然后程序调用 func 函数在栈区再次分配一些空间用于存储函数调用时的参数和返回地址。
在 func 函数中定义了一个局部变量 a它会被分配到栈区中。同时使用 new 运算符动态分配了一块内存并使用指针 p 指向它这块内存会被分配到堆区中。最后在函数结束前使用 delete 运算符释放了动态分配的内存。 func 函数执行完毕后栈区中为该函数分配的空间会被自动释放。然后程序返回到 main 函数并继续执行。当 main 函数执行完毕后栈区中为该函数分配的空间也会被自动释放。最后程序结束运行操作系统会回收为程序分配的所有内存空间。
三、new 运算符详解
new 运算符是 C 中用于在堆区动态分配内存的运算符。它可以用来为单个变量或数组分配内存返回指向分配内存的指针。例如
int *p new int; // 在堆区分配一个 int 类型的内存
int *arr new int[10]; // 在堆区分配一个长度为 10 的 int 类型数组使用 new 运算符分配的内存需要使用 delete 运算符进行释放否则会容易造成内存泄漏。例如
delete p; // 释放 p 指向的内存
delete[] arr; // 释放 arr 指向的数组内存
new 运算符还可以与构造函数一起使用用来初始化动态分配的对象。例如
class MyClass {
public://value(x) 是构造函数的初始化列表中的一条语句它用于初始化类的成员变量 value。MyClass(int x) : value(x) {}int value;
};MyClass *p new MyClass(10); // 在堆区分配一个 MyClass 对象并调用构造函数进行初始化
cout p-value endl; // 输出 10
delete p; // 释放 p 指向的内存
此外new 运算符还支持定位 new允许在指定的内存地址上构造对象。例如
char buffer[100];
MyClass *p new (buffer) MyClass(10); // 在 buffer 的地址上构造一个 MyClass 对象
cout p-value endl; // 输出 10
p-~MyClass(); // 调用析构函数销毁对象