zoukankan      html  css  js  c++  java
  • C++动态持久内存分配(new)

    动态持久内存分配

    new关键字可以在运行时为基本数据类型、数组和对象分配持久的内存空间。

    假如我们想实现一个不改变原数组而返回一个将原数组翻转的函数,如果按照一般的思路,我们写出来的代码是这样的:

    #include <iostream>
    
    using namespace std;
    
    int* reverse(const int* list, int size){
        //由于C++中不允许变量作为数组大小,所以暂且设置为6
        int result[5];
    
        for (int i = 0, j = size - 1; i < size;i++, j--){
            result[i] = list[j];
        }
        return result;
    }
    
    void printArray(const int* list, int size){
        for (int i = 0; i < size;i++){
            cout << list[i] << " ";
        }
        cout << endl;
    }
    int main()
    {
        int list[5] = {1, 2, 3, 4, 5};
        int* p = reverse(list, 5);
        printArray(p,5);
        return 0;
    }

    但是运行结果如下:

     程序执行了一会返回一个非0数。我们之前说过,因为我们的main函数return 0,所以程序正常结束的话,应该返回0而不是-1073741819。

    那么为什么会出现这样的错误呢,因为reverse函数中的result数组是一个局部变量,所以在函数之外访问这个数组的元素是不确定的。因此程序会报错。

    那么如何解决呢?这时候就需要使用动态持久内存分配,也就是关键字new了。由于之前的result数组是局部变量,函数结束后就会销毁。所以我们可以用new来使result分配一段持久的内存空间。具体代码是把

    int result[5];

    换成

    int* result = new int[size];

    这样以来,就会为result分配一段大小为size*sizeof(int)的内存空间,而且在函数结束之后不会销毁。那么如何释放这段内存呢?我们之后再说,先看程序的运行结果:

     符合预期。

    释放

    delete会显示的释放由new操作符分配的内存空间。

    分为两种情况:

    1. 释放的是一个指针

    delete p;

    p是一个由new分配内存的指针。

    2. 释放的是一个数组的内存空间

    delete [] list;

    list是一个由new分配内存数组。

    这里要强调一下释放内存的重要性。

    看下面的代码:

    int* p = new int;
    *p = 45;
    p = new int;

    上面的代码中,我们没有delete指针p就再次使用new为其分配了新的内存空间。这会使原来p指向的位置无法被访问,也不能够被释放,这种现象叫做内存泄漏。如果这样无法访问的内存空间有很多,那么你计算机的内存会极大的被占用。

    每个new操作都应该具有一个delete操作。

  • 相关阅读:
    Linux 文件取交集 并集 差集
    阿里花名推荐
    Linux bg fg命令的使用
    python导入自己创建的本地包报错
    数值计算方法
    数据库oracle回顾
    使用visualBox创建Centos/7,搭建docker,安装mysql,及远程连接
    git 合并分支到master
    git 本地文件修改错误,重新取回服务器历史版本
    三本不错的计算机专业书籍(需求分析,开发实务,恶意代码分析)
  • 原文地址:https://www.cnblogs.com/bwjblogs/p/12712552.html
Copyright © 2011-2022 走看看