zoukankan      html  css  js  c++  java
  • this-封装-内存空间的布局-堆空间-对象的内存

    #include <iostream>
    using namespace std;
    
    struct Person {
        int m_age;
        
        void run() {    // 函数的代码都在代码区
            cout << "Person::run() - " << m_age << endl; 
        }
    };
    
    int main() {        // 函数的代码都在代码区
    
        Person person1;    //局部变量,栈空间
        person1.m_age = 10;
        person1.run();
    
        Person person2;    //局部变量,栈空间
        person2.m_age = 20; 
        person2.run();
    
        getchar();
        return 0;
    }
    
    • 栈空间、堆空间、代码区、全局区

    this 存函数调用者的地址,指向了函数调用者

    void run() {    //隐式参数,this偷偷给函数传了一个指针地址的参数
        cout << "person::run() - " << this->m_age << endl;    //谁调用run()函数,this就访问谁
    }
    person1.run();
    // this = &person1    this存的是&person1的指针
    
    • 堆空间只能用指针
    • 函数栈空间先用cc填充
      cc ->int3 起到断点的作用

    封装

    • 成员变量私有化,提供getter和setter给外界去访问成员变量
    struct Preson {
    private:
        int m_age;
    public:
        void setAge(int age){
            if (age <=0 ) {
                m_age = 1;
            } else {
                m_age = age;
            }
        }
        
        int getAge() {
            return m_age;
        }
    };
    
    int main() {
        Preson person;
        person.setAge(-4);
    
        cout << person.getAge() << endl;
        //person.m_age = 4;
    
    }
    

    内存空间的布局

    • 每个应用都有自己独立的内存空间
      • 代码段(代码区):用于存放代码,只读
      • 数据段(全局区):放全局变量,整个程序运行过程中都在
      • 栈空间:每调用一个函数就分配一段连续的空间,调用完毕后自动回收
      • 堆空间:需主动申请和释放

    堆空间

    • 在程序运行过程,为了能自由控制内存的生命周期、大小,会经常使用堆空间的内存
    • 相声版解释:你还有100的血,被一个技能打中损失了99的血。内存怎么能把你给回收了呢?需要精准的计算以后来控制内存啥时候把你释放掉。你死了以后总要复活继续推搭吧?需要精准计算倒计时来想内存申请空间,大小。100的血,总不能乱分配你10000的血吧。
    • 堆空间的申请、释放。malloc、free(C语言方式)
    • C++堆空间申请、释放:new、delete
    int *p = (int *) malloc(4);    //堆空间申请4个字节,会返回申请空间的首地址
    *p = 10;    //拿到堆空间的首地址后,把10放进去
    
    void test() {    //函数执行结束后,回收栈空间;堆空间是永远不会回收的
        int *p = (int *) malloc(4);
        *P = 10;
    
        free(p);    //把堆空间地址值放进去,就会回收掉
    }
    
    int age = 10;    //栈空间申请4个字节
    

    c++申请方式

    int *p = new int;
    *p = 10;
    
    delete p;
    
    char *p = new char;
    *p = 10;
    
    delete p;
    
    char *p = new char[4];
    *p = 10;
    
    delete[] p;
    

    堆空间的初始化

    int size = sizeof(int) * 10;
    int *p = (int *) malloc(size);
    // memory set   给个地址,初始化为多少,多少字节
    memset(p, 0, size);
    
    int *p = new int();    //被初始化为0
    int *p = new int(1);    //被初始化为1
    

    对象的内存

    • 全局区(数据段):全局变量
    • 栈空间:函数里面的局部变量
    • 堆空间:malloc、new等
  • 相关阅读:
    Excel打印视图模式,界面网格模式等设置
    如何跳槽,如何找工作?
    使用Typora编写Markdown的介绍及快捷键的使用
    Office 2016 简体中文批量授权版镜像下载(含Visio、Project)
    Microsoft SQL Server 2016 官方简体中文64位企业版下载(含激活序列号密钥)
    python解析库lxml的简单使用
    二分查找——Find Peak Element,主要是利用index+1和index-1来判断走向
    RCE——远程命令/代码执行
    Java反序列化漏洞原理和检测
    S-H-ESD——就是先识别出趋势(中位数),然后做残差,利用残差看看正态分布的偏离点
  • 原文地址:https://www.cnblogs.com/sec875/p/12266711.html
Copyright © 2011-2022 走看看