C++ 内存管理简明教程

C++ 在运行时给变量或数组分配内存,也称为动态内存分配。其他语言(如Java, Python)由编译器控制内存,但C++需要手动维护,当不需要时也要手动回收动态创建的内存。本文介绍C++动态内容管理,并通过示例进行说明。

内存管理目的

数组包括相同类型数据,大多数情况下声明数组时,内存已经分配。如果分配太小,可能不够使用,反之可能造成浪费。那么最好的办法使用new操作符在运行时动态分配。

new操作符

下面示例使用new操作符给指针变量分配内存.

// 声明 int 指针
int* pointerVar;

// 动态分配内存
pointerVar = new int;

// 给地址赋值
*pointerVar = 55;

动态分配内存返回地址赋值给指针变量。如果是数组,则返回数组的首地址。

new 语法如下:

pointerVar = new dataType;

delete操作符

已分配的指针变量,当不再使用我们可以使用delete操作符回收内存。
delete操作符语法:

delete pointerVar;

// 声明int指针
int* pointVari;

// 动态分配内存
pointVari = new int;

// 赋值给指针对应地址
*pointVari = 55;

// 打印内存值
cout << *pointVari;

// 回收内存
delete pointVari;

关于delete操作符,下面几点需要说明:

  • 必须确保该变量是通过new分配的,不是在栈的局部变量、全局变量(命名空间范围的)或其他对象的成员变量
  • 必须确保该变量不再被使用,如果不确定,可以与nullptr比较。

动态分配内存方式

每个C++软件的内存结构可简化为:

  • 代码段

是保存包含执行指令的编译程序的地方。它们是只读的,代码段处在堆栈和堆的后面,以避免被覆盖。

  • 数据段

是维护全局变量和静态变量的地方,可进行读写。

堆栈是一种预先分配的内存类型。堆栈是后进先出的数据结构。当变量不在作用域内时,内存会被释放。当堆栈变量被移除时,其他变量就可以访问它所使用的内存空间。当函数调用时,会push和pop局部变量,堆栈会扩展和收缩。它跟踪局部变量,返回值地址、实参以及内存状态。

应用程序运行时分配的内存区域。使用new操作符分配内存,而使用delete操作符处理内存。
在这里插入图片描述

动态分配基本类型

下面示例展示动态分配基本数据类型。

#include <iostream>
using namespace std;
int main() {
    // 声明指针
    int* pntInt;

    // 声明float类型指针
    float* pntFloat;

    // 动态分配内存
    pntInt = new int;
    pntFloat = new float;

    // 赋值
    *pntInt = 55;
    *pntFloat = 55. 55f;
    cout << *pntInt << endl;
    cout << *pntFloat << endl;

    // 回收内存
    delete pntInt;
    delete pntFloat;
    return 0;
}

输出结果:

55
55. 55

动态分配数组

下面示例展示输入学生数量,动态分配数组大小。

#include <iostream>
using namespace std;

int main() {
    int numb;
    cout << "输入学生总数: ";
    cin >> numb;
    float* pntr;

    // 分配内存
    pntr = new float[numb] ;
    cout << "输入成绩:" << endl;
    for (int c = 0; c < numb; ++c) {
        cout << "Student" << c + 1 <<  ": ";
        cin >> *(pntr + c) ;
    }

    cout << "\n显示成绩:" << endl;
    for (int c = 0; c < numb; ++c) {
        cout << "Student" << c + 1 << " : " << *(pntr + c) << endl;
    }

    // 回收内存
    delete[] pntr;
    return 0;
}

输出结果:

输入学生总数: 5
输入成绩:
Student1: 4.4
Student2: 5
Student3: 3
Student4: 7
Student5: 8
显示成绩:
Student1: 4.4
Student2: 5
Student3: 3
Student4: 7
Student5: 8

注意这里使用 delete[] pntr ,[] 表示回收整个数组。

动态分配对象类型

下面示例定义Stud类,其中包括私有变量age,缺省构造函数初始化age为10。main函数中使用new操作符动态构建pntr对象指针。

#include <iostream>
using namespace std;
class Stud {
    int age;
public:
    // 构造函数初始化age
    Stud() : age(10) {}
    void getAge() {
        cout << "Age: " << age << endl;
    }
};

int main() {

    // 动态声明 Student类型对象
    Stud* pntr = new Stud() ;

    // 通过指针调用成员函数
    pntr->getAge();

    // 回收内存
    delete pntr;
    return 0;
}

输出结果:

Age: 10
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值