C 内存的存储方案与动态分配new的讲解

樱花树下 2024-08-01 ⋅ 19 阅读

1. 内存的存储方案

在C++中,变量和对象都需要被存储在内存中以供程序使用。内存分为栈(Stack)和堆(Heap)两种存储方式。

1.1 栈

栈是一种自动分配和释放内存的数据结构,使用后会自动回收内存。栈是按照“先进后出”的顺序存储数据。当一个函数被调用时,栈会为函数分配一块内存空间,用于存储函数的局部变量、函数参数和返回地址等信息。当函数执行完成后,栈会自动释放这块内存空间。

void func() {
    int x = 10; // 在栈中分配内存
}

1.2 堆

堆是一种手动分配和释放内存的数据结构,需要程序员手动申请和释放内存。堆中的内存需要手动分配,手动释放,否则会造成内存泄漏。堆中的内存没有固定分配和释放的顺序,可以根据程序的需要进行随时分配和释放。

int* p = new int; // 在堆中分配内存
delete p; // 释放内存

2. 动态分配new

C++中,使用new运算符可以动态分配内存,即在堆中分配内存。动态分配内存可以使得程序运行时根据需求动态地申请和释放内存。动态分配的内存在没有被手动释放时会一直存在,直到程序结束才会自动释放。

2.1 动态分配单个变量内存

使用new运算符可以动态分配堆内存来存储单个变量。

int* p = new int; // 在堆中分配一个int类型的变量
*p = 10; // 给p所指向的内存赋值为10
delete p; // 释放p所指向的内存

2.2 动态分配数组内存

使用new运算符还可以动态分配堆内存来存储数组。

int* arr = new int[5]; // 在堆中分配一个含有5个int元素的数组
for (int i = 0; i < 5; i++) {
    arr[i] = i; // 给数组元素赋值
}
delete[] arr; // 释放数组内存

2.3 动态分配对象内存

使用new运算符还可以动态分配堆内存来存储对象。

class MyClass {
    // 类的成员和方法
};

MyClass* obj = new MyClass(); // 在堆中分配一个MyClass对象
// 对象的操作
delete obj; // 释放对象内存

总结

C++中的内存存储方案包括栈和堆两种。栈是自动分配和释放内存的数据结构,堆是手动分配和释放内存的数据结构。使用new运算符可以动态分配堆内存,可以动态分配单个变量、数组和对象的内存。记得使用delete或delete[]来释放分配的内存,以避免内存泄漏的发生。动态分配的内存在不需要时要及时释放,以提高程序的效率和性能。


全部评论: 0

    我有话说: