在linux上替换动态库的内存变化分析

2023-11-06


在linux上替换动态库的内存变化


测试static变量:
static string staticString = "123";
void queryFreezingMoney(CFmlBuf& inBuf, CFmlBuf& outBuf)
{
    string in = GetString(inBuf,"SEND_CODE");
    if (in == "1")
    {
    staticString = GetString(inBuf,"SEND_DESC");
    }
    else
    {
    outBuf.SetString("OPER_DESC",staticString);
    }
}

当send_code传入非1时,可以传入send_desc修改staticString的值,假设修改为"456"后,每次查询OPER_DESC的返回都是新的值"456"。证明static起作用。

然后,重新替换so动态库(queryFreezingMoney函数编译在动态库中),替换后和替换前的动态库中代码是完全一样,此时再调用,OPER_DESC返回"123"。证明替换动态库,即使不重启程序,也会使得全局数据区的内存重新加载。

单例和static有点相似,他们在内存区一样吗?
不一样。单例是new创建的,它在堆区;static在上一篇文章说了,在全局数据区。

所以,接着我们需要测试,替换了动态库,堆区的内存是如何变化的。

ArchQuery.h
class ArchQuery
{
public:
    static string singletonString;
};

ArchQuery.cpp
string ArchQuery::singletonString = "abc";


ArchQueryMgr.cpp
typedef Singleton<archquery::ArchQuery> ArchQueryHolder;
void queryFreezingMoney(CFmlBuf& inBuf, CFmlBuf& outBuf)
{
    string in = GetString(inBuf,"SEND_CODE");
    if (in == "1")
    {
    ArchQueryHolder::getInstance().singletonString = GetString(inBuf,"SEND_DESC");
    }
    else
    {
    outBuf.SetString("OPER_DESC",ArchQueryHolder::getInstance().singletonString);
    }
}

结论同上。
singletonString初始化为abc,可以修改为def,替换动态库后,又重新变为abc。


最后,测试单例非static变量:
ArchQuery.h
class ArchQuery
{
public:
    string singletonString;
    void setSingletonString(string str)
    {
    singletonString = str;
    }
};

ArchQueryMgr.cpp
typedef Singleton<archquery::ArchQuery> ArchQueryHolder;
void queryFreezingMoney(CFmlBuf& inBuf, CFmlBuf& outBuf)
{
    string in = GetString(inBuf,"SEND_CODE");
    if (in == "1")
    {
    ArchQueryHolder::getInstance().setSingletonString(GetString(inBuf,"SEND_DESC"));
    }
    else
    {
    outBuf.SetString("OPER_DESC",ArchQueryHolder::getInstance().singletonString);
    }
}

singletonString没有初始化值,可以通过传入SEND_DESC首先把singletonString的值设为def,替换动态库后,值依然为def!
结论,替换动态库并不能使堆区的内存变化。

总结:
1 一般的static变量,替换了动态库会重新加载
2 如果是单例的static变量,替换了动态库会重新加载
3 如果是单例的非static变量,替换了动态库不会重新加载



===================
附录:

环境:
Red Hat Enterprise Linux Server release 6.3 (Santiago)
Kernel 2.6.32-279.el6.x86_64 on an x86_64

编译器 :
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)


顺带说一下,这个问题在aix上是都会重新加载的。所以两个平台迁移的时候要注意了。

AIX Version 5.3
aix编译器:
  xlC.adt.include            9.0.0.0    C     F    C Set ++ Application
  xlC.aix50.rte             10.1.0.3    C     F    XL C/C++ Runtime for AIX 5.3
  xlC.cpp                    9.0.0.0    C     F    C for AIX Preprocessor
  xlC.msg.ZH_CN.cpp          9.0.0.0    C     F    C for AIX Preprocessor
  xlC.msg.en_US.cpp          9.0.0.0    C     F    C for AIX Preprocessor
  xlC.msg.en_US.rte         10.1.0.3    C     F    XL C/C++ Runtime
  xlC.msg.zh_CN.cpp          9.0.0.0    C     F    C for AIX Preprocessor
  xlC.rte                   10.1.0.3    C     F    XL C/C++ Runtime

===============

再附两个报错信息:

static string singletonString;// 注意,这里不能初始化,否则会报错
报错:
ArchQuery.h:15: error: invalid in-class initialization of static data member of non-integral type 'std::string'

然后ArchQuery.cpp必须定义:
string ArchQuery::singletonString;

否则会报错。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在linux上替换动态库的内存变化分析 的相关文章

随机推荐

  • springboot运行时内存溢出_SpringBoot 使用 Caffeine 本地缓存

    点击上方 SpringForAll社区 轻松关注 及时获取有趣有料的技术文章 本文来源 http www mydlq club article 56 一 本地缓存介绍 二 缓存组件 Caffeine 介绍 1 Caffeine 性能 2 C
  • 双色球笔记3--输出所有中奖号码

    双色球笔记3 输出所有中奖号码 1 功能 本文主要根据中奖类别输出所有中奖号码 双色球奖项分为6种 如下所示 一等奖 6 1 中奖概率为 红球33选6乘以蓝球16选1 1 17721088 0 0000056 二等奖 6 0 中奖概率为 红
  • ❤ElementUI Table表格

    ElementUI Table表格操作 一 实战部分一 1 表格基础属性 1 表格赋值数据 data
  • 通过 jd-gui 查看 jeeSite 的framework

    最近有一个单体应用开发 综合比对下选择了jeeSite 前端虽有瑕疵 后台功能确实做的不错 一切准备就绪 环境搭建好了 准备开发 需要修改角色信息 发现代码当中竟然没有 后来查看了下maven仓库下的jeesite framework 4
  • Qt信号与槽传递自定义数据类型

    Qt信号与槽之间传递typedef定义的数据类型或其他类型 在编译时不报错 但在执行时会报如下错误 QObject connect Cannot queue arguments of type elemType Make sure elem
  • R语言报错记录The following objects are masked from ‘package:stats’:decompose, spectrum

    报错记录 大家好 这里是想做生信大恐龙 的生信小白 这是一条简短的报错记录 参考了其他博主的方法 如有侵权 请联系删除 报错记录 报错记录 报错原因 解决方法 总结 报错原因 使用R语言第三方包 igraph 时出现了以下报错 The fo
  • 【Qt教程】3.5 - Qt5 QPainter绘图抗锯齿、相对坐标/平移坐标系、QPainter画图片、手动调用QPainter绘图事件

    GitHub源码仓库 Qt学习例程 1 QPainter绘图抗锯齿 抗锯齿测试 painter drawEllipse QPoint 100 50 50 50 设置 抗锯齿能力 抗锯齿会让绘图效率较低 painter setRenderHi
  • CVPR 2021

    双图层实例分割 物体的互相遮挡在日常生活中普遍存在 严重的遮挡易带来易混淆的遮挡边界及非连续自然的物体形状 从而导致当前已有的检测及分割等的算法性能大幅下降 本文通过将图像建模为两个重叠图层 为网络引入物体间的遮挡与被遮挡关系 从而提出了一
  • pip install PIL 报错

    使用 pip install PIL 时报如下错误 Collecting PIL Could not find a version that satisfies the requirement PIL from versions No ma
  • kubernetes常用命令汇总

    1 查询命名空间 kubectl get ns 2 查询服务名 kubectl get po 3 查询对应命名空间下的服务名 kubectl n namespace get po 4 根据命名空间下某个服务的查询日志 kubectl n n
  • Git1 基础

    1 什么是git 1 1 简介 GIT是一种分布式版本控制系统 通俗点说版本控制就是当文档写错了 能够让你回退到之前某个正确的版本 给你一着悔棋 1 2 版本控制系统 1 2 1 本地版本控制系统 许多人习惯用复制整个项目目录的方式来保存不
  • 服务器虚拟化优缺点

    将服务器物理资源抽象成逻辑资源 让一台服务器变成几台甚至上百台相互隔离的虚拟服务器 我们不再受限于物理上的界限 而是让CPU 内存 磁盘 I O等硬件变成可以动态管理的 资源池 从而提高资源的利用率 简化系统管理 实现服务器整合 让IT对业
  • java语言特点和跨平台原理

    Java语言 1 java的三大版本 JavaSE J2SE java的标准版本定位在客户端 主要用于桌面应用软件的编程 JavaEE 定位在服务器端java2的企业版 主要用于分布式网络程序的开发 如电子商务网站 JavaME J2ME主
  • 实验:使用SSMS创建并管理数据库及其基本表

    目录 题目要求 1 创建数据库 2 创建三个表 3 修改限制条件 4 创建及管理约束条件 5 录入基本数据 6 数据的更改和插入 7 分离与附加数据库 题目要求 实验课程 数据库系统原理 专业 计算机科学与技术 班级 实验日期 姓名 学号
  • Qt信号与槽的各种连接方式

    信号槽是 Qt 框架引以为豪的机制之一 当用户触发某个事件时 就会发出一个信号 signal 这种发出是没有目的的 类似广播 如果有对象对这个信号感兴趣 它就会连接 connect 绑定一个函数 称为槽slot 来处理这个信号 也就是说当信
  • sklearn库简述-zstarling

    文章目录 模型的选择与评估 划分数据集 评估模型 监督学习 最近邻 支持向量机 SVM 决策树 集成方法 朴素贝叶斯 线性回归 随机梯度下降 判别分析 模型的选择与评估 划分数据集 from sklearn model selection
  • 如何更改linux文件的拥有者及用户组(chown和chgrp)

    本文整理自 http blog 163 com yanenshun 126 blog static 128388169201203011157308 http ydlmlh iteye com blog 1435157 一 基本知识 在Li
  • [C/C++] undefined reference to ‘std::cout‘

    gcc TrackersManger cpp o TrackersManger 编译时出现如下错误 原因是 编译 cpp 文件时 需要使用 g 编译 改为如下即可 g TrackersManger cpp o TrackersManger
  • 国产操作系统迎来最好时代

    在国家强力政策推动及下游需求快速提升的双重作用下 网络安全和自主可控领域正在迎来行业大爆发 能够充分防范 永恒之蓝 等外来病毒侵袭 各方面日臻成熟的国产操作系统的最好时代已经渐行渐近 不久前 基于 永恒之蓝 攻击模块衍生出的 想哭 勒索病毒
  • 在linux上替换动态库的内存变化分析

    在linux上替换动态库的内存变化 测试static变量 static string staticString 123 void queryFreezingMoney CFmlBuf inBuf CFmlBuf outBuf string