• c++内存分类


    1、 代码段:放置代码

    2、 静态数据段:放置全局变量和static的局部变量,字符串常量

    3、 动态数据段:栈,放置局部作用域的变量,离开函数返回后就会被释放;堆,必须手动的分配和释放。

    关于字符串常量的说明

    1、 一个字符串常量在程序内只有一份,是在静态存储区的,所有指向该常量值的指针都指向这个地址,一直到该程序结束才会被释放。

    2、 常量是不能被修改的,通过指向它的指针或数组修改值时,会造成内存错误。

    代码说明

    char *test()

    {

    char *pp = "abcd";//该返回指针是有效的,因为字符串常量即使在函数返回后也不会//被释放,会一直存在的

    char pp[] = "abcd";//该返回指针是无效的,因为函数返回后,该临时数组就被释放//了,指向的内容就是非法的

    //通过下面是可行的,但是要注意内存的释放

    char *pp = new char[5];

    strcpy(pp, "abcd");

    static char pp[] = "abcd";//返回指针有效,变量存储在静态区,并且其值还可以修改

    cout << pp << endl;

    return pp;

    }

    与类相关的内存分配

    类中占用内存的有以下几部分

    1、 代码段,这个只有一份,所有对象都是共用的

    2、 变量段,包括自己的和从基类继承来的变量,静态变量不占用对象的内存大小

    3、 虚函数指针,这个类有几个虚函数表,每个对象就需要有几个虚函数指针。

    对象内存占用

    空类或只含有函数的

    占一个字节,这个字节里并没有什么内容

    无继承有变量类

    对象的大小就是所有变量所占的内存大小

    无虚函数的简单继承

    继承类对象大小就是基类和继承类里所有变量所占的内存之和

    有虚函数的继承

    除了上面说的之外,还多了一个指向虚函数的指针,并且这个类有几个基类,就会有几个这样的指针

  • 相关阅读:
    Request
    HTTP
    mysql递归查询函数
    redis 6.0.9配置文件详解
    java对数据进行加密、解密
    java Base64编码、解码
    nginx基础使用
    linux指令笔记
    Spring 常用注解粗陋看法
    docker 已有容器修改容器配置
  • 原文地址:https://www.cnblogs.com/suntp/p/6426304.html
Copyright © 2020-2023  润新知