[C++] 动态内存分配

目录

引言

1. 何为内存分配

2. 静态内存分配

3. 为何要使用动态内存分配

4.  方法

5. 注意事项

引言

        本文主要记录了使用C++(不是C语言)动态分配内存的方法。

        动态内存分配是C++编程中的一个重要概念,它允许程序在运行时根据需要分配和释放内存。理解这一概念对编写高效、灵活的程序至关重要。

1. 何为内存分配

        内存分配指的是在程序运行时,向程序提供所需的内存空间。内存分配分为静态内存分配和动态内存分配。

  • 静态内存分配:在编译时确定内存的大小和位置,分配的内存在整个程序运行期间一直存在。局部变量和全局变量就是采用静态内存分配。(系统自动分配)
  • 动态内存分配:在程序运行时根据需要分配内存,内存的大小和位置可以在运行时动态改变。动态内存分配的内存需要程序员手动释放,以避免内存泄漏。(程序员手动分配)

2. 静态内存分配

        如下是两种静态内存分配:

int main(){

    int num = 100;
    cout << num << endl;
    // 其他代码

    return 0;
}
int main(){

    int nums[] = { 1, 2, 3, 4, ..., 999999}; // 模拟很大内存的数组
    
    //使用nums数组

    // 其他代码

    return 0;
}
  • 如果整型变量num和整型数组nums在使用后,后续的程序中没有任何作用了,那么num和nums会一直占用内存空间,直至程序运行结束。

3. 为何要使用动态内存分配

        动态内存分配提供了以下几个主要优势:

  • 灵活性:可以根据程序的需求动态分配和释放内存,使得程序可以处理不同规模的数据。
  • 高效性:避免了预先分配大量内存导致的浪费。程序可以在需要时分配内存,释放不再需要的内存,提升内存利用率。
  • 复杂数据结构:支持动态数据结构如链表、树、图等,这些数据结构的大小在编译时无法确定。

4.  方法

        在C++中,动态内存分配主要通过newdelete操作符来实现。( C语言中使用的是mallocfree函数)。下面详细介绍newdelete的使用。 

         new操作符:用于在堆上分配内存。new返回一个指向分配内存的指针。

int* p = new int;      // 分配一个int类型的内存
int* arr = new int[10]; // 分配一个包含10个int的数组

         delete操作符:用于释放由new分配的内存,避免内存泄漏。

delete p;        // 释放一个int类型的内存
delete[] arr;    // 释放一个数组的内存

         完整使用示例:

#include <iostream>

using namespace std;

int main(){

    // 单个变量的动态内存分配
    int *p_int = new int;

    //使用
    *p_int = 100;
    cout << "new申请的" << sizeof(int) << "个字节空间内,存放的值是:" << *p_int << endl;

    delete p_int;     // 结束使用

    cout << "--------------------" << endl;

    //数组的动态内存分配
    int* p_arr = new int[5];

    // 使用
    p_arr[0] = 100;
    p_arr[1] = 200;
    p_arr[2] = 300;
    p_arr[3] = 400;
    p_arr[4] = 500;

    cout << "数组的第一个元素的值为:" << *p_arr << endl;
    cout << "数组的第二个元素的值为:" << p_arr[1] << endl;     // p_arr[i] = *(p_arr + i)
    cout << "数组的第三个元素的值为:" << *(p_arr + 2) << endl;
    cout << "数组的第四个元素的值为:" << *(p_arr + 3) << endl;
    cout << "数组的第五个元素的值为:" << *(p_arr + 4) << endl;
    cout << "数组的元素个数为:" << sizeof(p_arr) / sizeof(int) << endl;

    delete[] p_arr;    // 结束使用

    
    return 0;
}

        运行结果:

5. 注意事项

  • 内存泄漏:如果动态分配的内存没有被正确释放,会导致内存泄漏。程序运行时间越长,内存泄漏越严重,可能导致系统崩溃。
  • 空指针:使用动态分配内存的指针前,一定要确保其不为null,避免非法访问。
  • 数组分配和释放:分配数组内存时使用new[],释放时要使用delete[],否则可能导致未定义行为。
  • 高危操作: delete只能释放由new申请的内存空间,即只能释放动态分配(new)的内存。否则会报错(delete 变量)或内存高危操作(delete &变量)。
  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值