C++ 中的内存管理


2022 年 11 月 8 日, Learn eTutorial
1950

C++ 中的内存管理是一种控制计算机内存并为程序执行分配必要内存量的方法。由于它与其他编程语言共享相同的基本思想,因此几乎可以理解。它通过对整体计算机系统功能的改进来处理空间和内存的分配。在内存管理中使用数组至关重要,因为它们能够以合适的间距对齐方式存储数据,维护时间约束,并通过使用 new 关键字进行内存分配来有效管理资源。

C++ 中的内存管理是什么意思?

  • 管理计算机内存的过程涉及为程序分配内存空间以提高系统性能。
  • 在 C++ 中,我们可以在运行时为变量或数组分配内存。这主要称为“动态内存分配”。
  • 在我们使用完变量后,我们必须手动释放 C++ 中动态分配的内存。
  • 在 Java 和 Python 等其他编程语言中,变量内存分配由编译器自动管理。然而,C++ 与此不同。

C++ 中内存管理是如何工作的?

  • 对于任何编程语言,包括 C++,内存管理都是核心和最重要的概念之一。内存管理概念概述主要依赖于时间-空间权衡以及内存分配的概念。使用数组可以更容易地管理内存和空间问题。内存管理概念的主要部分,或者可以说支持部分,是称为数组的数据结构。数组是包含所有保存在内存中的数据的数据结构,通过有效的资源分配,并具有适当的时间和空间,因为它在数组声明时分配内存,然后必须使用 new 运算符在运行时动态分配内存,以防止内存浪费。
  • 在某些情况下,即使程序员声明了最大大小的数组并随后根据需要分配了内存,仍然可能会留下一些未使用的内存空间或单元。务必记住,使用 new 关键字定义数组的内存分配方法将处理这种情况。
  • 任何程序员还必须考虑在实现过程中程序流将如何进行,以及资源如何在内存管理方面有效地管理时间-空间权衡。尽管内存管理运算符在运行时处理内存分配,但它们仍应格外小心,因为这样做将防止它们追求任何形式的内存分配。
  • C++ 内存管理使用 new 和 delete 等一元运算符来分配内存,并为高效分配资源创建空闲空间。
  • C++ 内存管理中的内存运算符使用 new 和 delete 运算符。与 C 编程语言使用 malloc 和 calloc 函数在运行时动态分配内存,以及 free() 函数释放动态分配的内存不同,C++ 内存管理使用前面讨论过的 new 和 delete 等一元运算符来实现相同的目的:分配内存并为高效的资源分配创建空闲空间。

为什么需要内存管理?

  • 由于数组存储同类数据,因此通常在声明时为数组分配内存。
  • 在某些情况下,直到运行时才可能知道精确的内存。我们声明一个最大大小的数组以防止这种情况发生,但一些内存将保持未使用。
  • 通过使用 new 运算符在运行时动态分配内存,我们可以防止内存浪费。

内存是如何分配和释放的?

C 语言中的 malloc() 和 calloc() 函数用于在运行时动态分配内存,free() 函数用于释放动态分配的内存。C++ 包含这些函数,以及 new 和 delete 这两个运算符,它们改进并简化了内存的分配和释放操作。使用 new 和 delete 运算符,我们可以动态分配和随后释放内存。

C++ 中的 new 和 delete 运算符

C++ 中的 new 运算符

  • 使用 new 运算符为变量分配内存。
  • new 运算符请求在自由存储区分配内存。
  • 如果有足够的内存可用,new 运算符会初始化内存并将新分配和初始化的内存位置提供给指针变量。

语法


pointer_variable = new data-type;
 
  • ptr var:这代表指针变量的名称。
  • new:用于创建用于分配的对象的运算符。
  • data tp:标识分配期间使用的数据类型。
     

new 运算符使用上述语法创建对象。在上述语法中,指针变量的名称是“pointer variable”,"new" 是运算符,"data-type" 指定数据类型。

例如,让我们理解下面的代码


//  an int pointer declaration
int* ptVar;

//  memory is allocated dynamically 
// the new keyword is used
ptVar = new int;

// assign value to allocated memory
*pttVar = 7;

 

在这里,我们使用 new 运算符为 int 变量动态分配内存。

您会看到我们通过使用指针 ptVar 动态分配了内存。这是因为 new 运算符返回内存位置的地址。

对于数组,new 运算符返回数组第一个元素的地址。

C++ 中的 delete 运算符

由于程序员有责任释放动态分配的内存,C++ 语言提供了 delete 运算符。
如果我们不再需要动态声明的变量,我们可以释放它所使用的内存。
delete 运算符用于此目的。在此过程中,操作系统收回内存。这被称为内存释放。

语法


delete ptr_var;
 
  • delete:这代表在调用 new 运算符后应该调用的一元运算符。
  • ptr var:这是一个指向主要由 new 一元运算符形成的对象的指针,主要用于进一步删除。

例如,让我们理解下面的代码


//  int pointer declaration
int* ptVar;

// dynamically allocate the  memory for an int variable 
ptVar = new int;

//  value is  assigned to the variable memory
*ptVar = 9;

// print the value which is  stored in memory
cout << *ptVar; // Output: 9

// deallocate the memory
delete ptVar;
 

示例:让我们编写一个 C++ 程序来理解主要通过使用 new 和 delete 运算符进行的内存动态分配和释放。


#include <iostream>
using namespace std;

int main() {
    //  int pointer is declared
    int* pInt;

    //  float pointer is  declared
    float* pFloat;

    //  allocate the  memory dynamically
    pInt = new int;
    pFloat = new float;

    // assigning value to the memory
    *pInt = 2f;
    *pFloat = 2.24f;

    cout << *pInt << endl;
    cout << *pFloat << endl;

    // deallocate the memory
    delete pInt, pFloat;

    return 0;
}

输出

2
2.24

在这个程序中,我们使用动态内存分配创建了两个 int 和 float 类型的变量。我们给它们赋值,打印它们,然后释放删除的内存。