浅析C++中的动态内存分配

 更新时间:2024年03月10日 08:27:42   作者:梦_鱼  
这篇文章主要为大家详细介绍了C++中动态内存分配的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

程序在运行过程对内存进行分配申请与释放

new运算符

运行时存储分配,返回可以存放对应类型数据的内存地址,指向分配的内存空间

1.分配基础类型内存存储空间

#include <iostream>

using namespace std;

int main() {
    string *name;
    // 动态在堆空间分配存储空间,字符串值 北门吹雪 值存储到分配的内存空间
    name = new string("北门吹雪");

    cout << *name << endl;
    delete name;
}

2.动态分配一维数组空间

很多函数使用一维或二维数组,这些数组是在编译时大小未知的,数组容量的大小随着函数调用动态变大或者变小

#include <iostream>

using namespace std;

void alloc_one_dimensional(int len) {
    int *nums;
    // 内存分配可能会失败,通过try捕获程序中的异常
    try {
        // new对数组分配内存,返回数组中第一个元素的指针
        nums = new int[len];
    } catch (bad_alloc& e) {
        cout << "内存分配失败" << endl;
    }
    cout << "动态分配内存大小:" << len  << endl;
    // 是否动态分配的内存
    delete[] nums;
}

int main() {
    alloc_one_dimensional(10);
    alloc_one_dimensional(12);
    alloc_one_dimensional(13);
}

3.动态分配二维数组

如果形参是一个二维数组,必须指定第一维度的大小,a[][10] 合法,但是 a[][]非法,编译时就确定数组的长度,但很多场景下需要每个长度不一的二维数组

因为使用new对数组进行动态分配,返回数组中第一个元素的地址,所有创建二维数组则第二维度只保留指针

#include <iostream>

using namespace std;

template<class T>
void alloc_two_dimensional(T _, int number_of_rows, int number_of_columns) {
    // 先动态创建保存数组元素的指针
    int **matrix = new T *[number_of_rows];

    // 然后再依次创建一维数组
    for (int row = 0; row < number_of_rows; row++) {
        matrix[row] = new T[number_of_columns];
    }

    // 修改二维数组的值
    matrix[1][1] = 10;
    matrix[2][2] = 10;
    matrix[3][3] = 10;
    matrix[4][4] = 10;

    // 遍历二维数组
    for (int i = 0; i < number_of_rows; i++) {
        for (int j = 0; j < number_of_columns; j++) {
            cout << matrix[i][j] << "\t";
        }
        cout << endl;
    }

    // 释放内存
    // 首先释放保存在数组中的每一个元素指向的数组
    for (int i=0; i < number_of_rows; i++) {
        delete[] matrix[i];
    }
    
    // 释放最外层的数组
    delete[] matrix;
}

int main() {
    int a;
    alloc_two_dimensional(a, 9, 12);
}

delete 操作符

释放由new操作符动态分配的内存空间,调用对象关联类型的析构函数

  • 只能操作指针类型对象
  • 单个对象使用delete运算符,但多个对象的数组则需要使用delete[]运算符
#include <iostream>

int main() {
    int* y = new int(10);
    // 释放指针指向的单个对象的内存,调用对象的析构函数
    delete y;
	
    int *a = new int[10]{1, 2, 3, 4};
    // 释放指针指向的数组对象所有内存,遍历依次调用数组中元素对应的析构函数
    delete[] a;
}

使用场景:动态分配的内存空间(存储空间)不在需要时

到此这篇关于浅析C++中的动态内存分配的文章就介绍到这了,更多相关C++动态内存分配内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++利用随机策略实现优化二叉树操作效率

    C++利用随机策略实现优化二叉树操作效率

    这篇文章中我们主要来详细探讨随机化二叉搜索树的基本思想、实现方法,以及如何在C++中应用这些策略来优化我们的数据结构,感兴趣的可以了解下
    2024-02-02
  • 详解c++ 静态成员变量

    详解c++ 静态成员变量

    这篇文章主要介绍了c++ 静态成员变量的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-09-09
  • C语言版实现三子棋游戏

    C语言版实现三子棋游戏

    这篇文章主要为大家详细介绍了C语言版实现三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C++超详细讲解函数参数的默认值

    C++超详细讲解函数参数的默认值

    在C++中,定义函数时可以给形参指定一个默认的值,这样调用函数时如果没有给这个形参赋值(没有对应的实参),那么就使用这个默认的值。也就是说,调用函数时可以省略有默认值的参数
    2022-05-05
  • C++中的多态与虚函数的内部实现方法

    C++中的多态与虚函数的内部实现方法

    下面小编就为大家带来一篇C++中的多态与虚函数的内部实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C++ 学习之旅 Windows程序内部运行原理

    C++ 学习之旅 Windows程序内部运行原理

    学习C++与.net不同的是,一定要搞清楚Windows程序内部运行原理,因为他所涉及大多数是操作系统的调用,而.net毕竟是在.netFrameWork上唱戏
    2012-11-11
  • C++单链表实现大数加法

    C++单链表实现大数加法

    这篇文章主要为大家详细介绍了C++单链表实现大数加法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • 用C语言编写推箱子游戏

    用C语言编写推箱子游戏

    这篇文章主要为大家详细介绍了用C语言编写推箱子游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • OpenCV获取图像中直线上的数据具体流程

    OpenCV获取图像中直线上的数据具体流程

    对图像进行处理时,经常会有这类需求:客户想要提取出图像中某条直线或者ROI区域内的感兴趣数据,进行重点关注,怎么操作呢,下面小编通过实例代码介绍下OpenCV获取图像中直线上的数据,一起看看吧
    2021-11-11
  • 求斐波那契(Fibonacci)数列通项的七种实现方法

    求斐波那契(Fibonacci)数列通项的七种实现方法

    本篇文章是对求斐波那契(Fibonacci)数列通项的七种实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论