zoukankan      html  css  js  c++  java
  • C++内存管理方式

    今天写一个返回二维数组的函数碰到内存数据存储的问题,才发现没有真正理解c/c++内存。虽然书上的下面知识看了很多遍,以为就那么回事。但是实践碰到问题,才真正理解。

    -----------------------------------------------------------------------------------------

    C++三种管理内存方式:

    1.自动存储

    在函数内部定义的常规变量使用的自动储存空间,被称为自动变量(automatic variable)。

    通常储存在栈中,随函数的产生而产生,函数的消亡而消亡。

    2.静态存储

    实在整个程序执行期间都存在的存储方式。使变量成为静态储存的方式有两种:

    n  函数外面定义它

    n 在声明变量是使用关键字static

    3.动态储存

    数据的生命周期不完全受程序或函数的生命周期控制,可以通过newdelete运算符来管理,也可以使用库函数mallocfree。在c++中被称为自由储存空间(free store)或堆(heap

    -------------------------------------------------------------------------------------------

    #include<iostream>

     

    using namespace std;

     

    /*在不同函数定义中分别使用不同的内存申请做测试*/

    int * f();

    int * f_malloc();

    int *f_new();

    int *f_static();

    int ** f_2();

     

    //空函数,测试用

    void empty(){};

    int main(){

     

        int * t = f();//此时指针t指向的内存空间在栈中个,f_mallocf_newf_static,这三中方式都是动态储存,内存储存在自由堆中。不会导致下面的情况发生。

        int x1 = t[0];//x1 =1

        empty();//即使是空函数,也会调用栈,将上一个存储空间将被释放。如果只使用int n = 1;不会影响到*t指针的内存空间。

        int x2 = t[0];//x2 = -858993460

        int  ** t = f_2();//这样也不能用,必须将函数中的ab数组也设为static 或使用new将变量设为静态变量或动态变量才行。

        return 0;

    }

    int * f(){

        int  a[3] = { 1, 2, 3 };

        return a;

    }

    int * f_malloc(){

        int *a = (int *)malloc(sizeof(int) * 3);

        for (int i = 1; i < 4; i++)

        {

           a[i] = i+1;

        }

        return a;

    }

    int *f_new(){

        int * p = new int[3]{1, 2, 3};

        return p;

    }

    int *f_static(){

        static int a[3] = { 1, 2, 3 };

        return a;

    }

     

    int ** f_2(){

        int a[] = { 1, 2, 3 };

        int b[] = { 4, 5, 6 };

        static int *c[2] = { a, b };

    }

     

  • 相关阅读:
    如何看linux是32位还是64位
    Linux下,命令 wget 的使用
    express框架目录结构
    怎么在centos中查看某个目录的树结构?
    CentOS minimal版安装图形界面的步骤(自动获取IP)
    微信小程序项目,实现图书搜索组件完善
    微信小程序项目,实现图书搜索高阶组件:
    微信小程序中使用音频组件以及wx:if和hidden的区别
    微信小程序绑定数据以及自定义指令
    微信小程序定义一个组件
  • 原文地址:https://www.cnblogs.com/dingblog/p/4464970.html
Copyright © 2011-2022 走看看