当前位置: 首页 > news >正文

c++面试常见问题:虚表指针存在于内存哪个分区

在 C++ 中,虚表指针(vptr)所在的内存分区与对象的存储位置相关,下面分不同情况进行介绍:

栈区

当对象是在栈上创建的局部对象时,虚表指针会随着对象一起被分配到栈区。栈区主要用于存储函数内部的局部变量和函数调用的上下文信息,其内存分配和释放由系统自动管理。当函数执行结束,栈上的对象会被自动销毁,虚表指针也随之消失。

示例代码

#include <iostream>

class Base {
public:
    virtual void func() {
        std::cout << "Base::func()" << std::endl;
    }
};

void test() {
    Base obj;  // 在栈上创建对象
    // obj 对象的虚表指针位于栈区
    obj.func();
}

int main() {
    test();
    return 0;
}

在上述代码中,test 函数内部的 Base 对象 obj 是在栈上创建的,该对象包含的虚表指针也会存储在栈区。

堆区

  如果对象是使用 new 运算符在堆上动态分配的,那么虚表指针会随着对象一起被分配到堆区。堆区用于动态内存分配,由程序员手动管理内存的分配和释放(使用 new 和 delete)。只要对象没有被显式地使用 delete 释放,它就会一直存在于堆区,虚表指针也会一直存在。

示例代码

#include <iostream>

class Base {
public:
    virtual void func() {
        std::cout << "Base::func()" << std::endl;
    }
};

int main() {
    Base* ptr = new Base();  // 在堆上创建对象
    // ptr 指向的对象的虚表指针位于堆区
    ptr->func();
    delete ptr;  // 释放堆上的对象
    return 0;
}

 在这个例子中,Base 对象是通过 new 运算符在堆上创建的,其虚表指针也会存储在堆区,直到使用 delete 释放该对象。

全局 / 静态存储区

  当对象是全局对象或者静态对象时,虚表指针会存储在全局 / 静态存储区。全局对象在程序启动时就被创建,直到程序结束才被销毁;静态对象在第一次使用时被创建,并且在程序的整个生命周期内都存在。

示例代码

#include <iostream>

class Base {
public:
    virtual void func() {
        std::cout << "Base::func()" << std::endl;
    }
};

Base globalObj;  // 全局对象,虚表指针位于全局/静态存储区

void test() {
    static Base staticObj;  // 静态对象,虚表指针位于全局/静态存储区
    staticObj.func();
}

int main() {
    globalObj.func();
    test();
    return 0;
}

在上述代码中,globalObj 是全局对象,staticObj 是静态对象,它们的虚表指针都存储在全局 / 静态存储区。

虚表本身的存储位置

虚表(vtable)通常存储在只读数据段(RODATA),这是因为虚表中的内容在程序运行期间是固定不变的,包含了类的虚函数的地址等信息,将其放在只读数据段可以保证数据的安全性和共享性。

相关文章:

  • LeetCodehot 力扣热题100 组合总和
  • 【C】初阶数据结构8 -- 链式二叉树
  • 计算机毕业设计SpringBoot+Vue.js人力资源管理系统(源码+文档+PPT+讲解)
  • MCP与RAG:增强大型语言模型的两种路径
  • 【算法】【并查集】acwing算法基础837. 连通块中点的数量
  • 每日一题——接雨水
  • 制作安装win10系统U盘详细步骤
  • 深入解析HDFS:定义、架构、原理、应用场景及常用命令
  • 【C++并发编程实战】第1章 你好,C++的并发世界!
  • Golang语言特性
  • C语言:51单片机 常用电子元器件讲解(带英文名称)
  • Java-servlet(一)Web应用与服务端技术概念知识讲解
  • Linux top 常用参数记录
  • 扫描局域网可用端口
  • 【计算机网络入门】初学计算机网络(五)
  • 常见的 Spring 项目目录结构
  • MAC OS安装Python教程
  • C++编程指南21 - 线程detach后其注意变量的生命周期
  • JavaScript异步处理确保排序不乱的方案
  • 16981等腰三角形
  • 冒充现役军人、自称有中国兵工集团投资内幕,2人被刑拘
  • 上海黄浦:新婚夫妻来登记可“摇号”定制无人机表演,每周三对
  • 上海发布台风红色预警?实为演练,今日下午局部中雨下班请注意
  • 国际观察丨美中东政策生变,以色列面临艰难选择
  • 新华每日电讯:博物馆正以可亲可近替代“高冷范儿”
  • 上海这个咖啡文化节首次“走出去”,率本土品牌亮相英国伦敦