- 单例模式下的自动内存释放和模板
叙白大人
单例模式开发语言c++
文章目录前言一.使用atexit释放内存二.使用模板前言在单例模式中,由于没有自动调用类的析构机制,导致无法内存释放,本文将介绍两种自动释放的方法一.使用atexit释放内存atexit是C++标准库中的一个函数,用于在程序退出时执行一些清理工作。它的工作原理是,当程序正常退出(例如,通过调用exit函数或接收到一个信号)时,atexit会按照注册的顺序执行这些清理工作。classSingleCl
- MFC:基于OPenGL的三维渲染控件样例代码
pdycp
openglmfcc++
opengl类Myopengl.h#pragmaonce#include#pragmacomment(lib,"glut64.lib")#defineGLUT_DISABLE_ATEXIT_HACK#include"glut.h"classMyopengl:publicCWnd{public:Myopengl();~Myopengl();voiddisplay();//绘制图形voidlight(
- Python中的atexit模块:让你的代码优雅退出
胖头鱼不吃鱼-
pythonjava服务器
在Python编程中,我们经常需要在程序运行结束时执行一些清理工作。这可能包括关闭文件、释放资源、发送日志消息等等。为了帮助我们实现这些任务,Python提供了一个名为atexit的模块,它允许我们注册在程序退出时执行的函数。什么是atexit模块?atexit模块是Python标准库中的一部分,它提供了一种简单的方法来注册在程序退出时执行的函数。这些函数将在程序退出之前按照注册的顺序被调用。如何
- C语言中在main函数之后运行的函数
迎風吹頭髮
编程小记c语言开发语言
在Linux平台上,atexit函数同样是一个用于注册终止处理函数的库函数,它是C标准库的一部分。atexit函数允许你注册一个或多个函数,这些函数会在main函数执行结束后,或者在调用exit函数时,由exit自动调用。这些函数通常用于执行一些清理任务,如关闭文件、释放资源等。atexit函数的原型如下:intatexit(void(*func)(void));它接受一个函数指针作为参数,该函数
- python 程序终止时执行退出函数atexit
Yu_摆摆
python开发语言
atexit函数介绍可参考python之atexit模块学习atexit应用场景atexit可以在程序正常结束运行退出时调用(异常报错中断不会调用),除此之外,atexit也可以捕捉sys.exit(),os._exit()等退出的情况。当程序出现这些终止或退出时,系统在退出之前会执行atexit函数。若程序结束前需要对一些数据进行处理则可以使用该函数。使用实例该实例编写了一个telnet多个站点
- 番茄英语口语句子小结
王虹亮
图片发自App坐车Let'sfirstfigureouthowtogettothetram.我们先看看怎么坐电车吧。WhatexitdoIgetoff?我应该在哪站下车?Doyoumindpointingmeintherightdirection?你能给我指一下方向吗?Wehaveonemorestopuntilweneedtogetoff.我们还有一站就下了。就餐Whatshouldyousay
- APUE_第7章 进程环境_学习笔记
rens111
APUE
7.1引言7.2main函数1)gcc编译器调用ld链接器,链接器一开始启动一个特殊的启动例程(此启动例程是程序的起始地址),启动立场从进程空间高地址处取得命令行参数和环境变量参数,然后调用main函数;7.3进程终止1)exit函数先执行一个标准的IO库的清理关闭操作:调用fclose函数关闭所有的流,使得所有的缓冲数据被冲洗;然后调用_exit或是_Exit;2)atexit函数,用来等级终止
- 一文讲透Linux应用编程—进程原理
Trump. yang
Linux笔记linux运维服务器
文章目录程序的开始和结束main函数由谁调用?程序是如何结束的?atexit注册进程终止处理函数return、exit、_exit三者区别进程环境环境变量进程运行的虚拟空间进程的正式引入什么是进程?进程ID多进程调度原理fork创建子进程为什么要创建子进程?fork的内部原理父子进程对文件的操作进程的诞生和消亡进程的诞生进程的消亡僵尸进程孤儿进程waitpid介绍waitpid和wait的区别?w
- 设计模式之单例模式
十五年专注C++开发
#设计模式/架构设计设计模式单例模式c++
目录概述构造函数私有化方式1.声明private2.=delete实现方式1.静态局部变量方式2.静态成员变量方式3.双重检测指针和atexit方式4.双重检测指针和自定义销毁器方式5.智能指针方式6.智能指针和自定义销毁器方式7.Qt的原子指针方式优点缺点使用场景概述单例模式是创建型设计模式中的一种,创建型模式它主要是用来管理对象的分配和释放;单例模式又称单件模式,实质是一种经过改进的全局变量;
- 2018-10-21
家中古词
进程终止exit(int)执行若干清理活动之后调用_Exit(int)返回内核。等价于主函数return对应的退出码。使用atexit(void(*)(void))注册函数,在退出之后调用。但至多指定32个函数。执行完这些用户指定的函数之后,再执行设定好的清理活动,典型的例子可能是fflush(stdout)这类事情。C程序进程的存储空间正文段(text):机器指令,一般是只读的。初始化了的数据段
- TB-C/C++
lucky1_1star
c++c语言算法
1.main函数之前之后执行的代码设置栈指针初始化静态变量和全局变量(.data段内容,已初始化且不为0)赋初值(.bss段内容,未初始化的全局变量和静态变量)传参(argc,argv)atexit()在vs2010上没有效果#include#includeusingnamespacestd;intf(){printf("before\n");return0;}voidf2(){printf("E
- [python][转载]python rabird实现驱动级模拟按键
FL1623863129
Pythonpyhton
查询资料得知好像只能对ps/2键盘有效,代码网上找的,先这里备份一下,后面有时间研究importrabird.winioimporttimeimportatexit#KeyBoardCommands#CommandportKBC_KEY_CMD=0x64#DataportKBC_KEY_DATA=0x60__winio=Nonedef__get_winio():global__winioif__w
- 9. 进程
等你看日出
嵌入式Linux应用开发嵌入式硬件
9.进程1.进程与程序1.1main()函数由谁调用1.2程序如何结束1.2.1注册进程终止处理函数atexit()1.3何为进程1.4进程号2.进程的环境变量2.1应用程序中获取环境变量2.1.1获取指定环境变量2.2添加/删除/修改环境变量2.2.1putenv()2.2.2setenv()2.2.3命令行式添加2.2.4unsetenv()2.3清空环境变量2.4环境变量的作用3.进程的内存
- linux系统和网络(二):进程和系统时间
菜_小_白
linuxc语言
本文主要探讨linux系统进程和系统相关知识,本博客其他博文对该文章的部分内容有详细介绍main函数intmain(intargc,char*argv[],char*envp[]);操作系统下main执行前先执行引导代码,编译连接引导代码和程序连接在一起构成可执行程序,加载器将程序加载到内存中执行程序终止(return、exit、_exit、atexit)intatexit(void(*funct
- go atexit源码分析
风华同学
Go语言学习之旅golang开发语言后端
文章目录atexit源码解析UML类图样例一:程序退出之前执行注册函数1.1流程图1.2代码分析样例二:使用cancel取消注册函数2.1cancel流程图2.2代码分析样例三:使用Fatal/Fatalln/Fatal执行注册函数3.1Fatal/Fatalln/Fatal流程图3.2代码分析atexit源码解析当我们在执行程序的时候如果想要在退出程序的时候,执行一些清理函数或者日志输出函数等,
- c语言strtof函数用法,c语言工具函数
aye toms
c语言strtof函数用法
abortabsassertatexitatofatoiatolatollbsearchdivexit_Exitgetenvlabsllabsldivlldivlongjmpqsortraiserandsetjmpsignalsrandstrtodstrtofstrtolstrtoldstrtollstrtoulstrtoullsystemva_arg、var_copy、va_start及va_e
- linux线程间的通信(pthread_cleanup_push和pthread_cleanup_pop,pthread_join,pthread_detach)
panamera12
线程可以安排他退出时需要调用的函数,这与进程可以用atexit函数安排进程退出时需要调用的函数是类似的。这样的函数称为线程清理处理程序,线程可以建立多个清理处理程序。处理程序记录在栈中,也就是说他们的执行顺序与他们注册的顺序相反。pthread_cleanup_push和pthread_cleanup_pop函数原型如下:头文件:#include函数原型:voidpthread_cleanup_p
- 【科研绘图】MacOS上的LaTeX公式插入工具——LaTeXiT
Mr.zwX
【写作】LaTeX画图macosLaTeX
在Mac上经常用OmniGraffle绘图,但是有个致命缺点是没办法插入LaTeX公式,很头疼。之前有尝试用Pages文稿插入公式,但是调字体和颜色很麻烦。并且,PPT中的公式插入感觉也不太好看。偶然机会了解到了LaTeXiT这个工具,可以输入LaTeX公式,然后导出各种各样的格式(pdf、png、svg等),非常方便插入到各种绘图软件中。安装LaTeXiT则需要LaTeX环境,在MacOS上直接
- UNIX环境高级编程 进程环境
peixun123
C和C++学习笔记shellc/c++操作系统
相关函数列表//退出函数#includevoidexit(intstatus);void_Exit(intstatus);#includevoid_exit(intstatus);//按照ISOC的规定,一个进程可以登记多至32个函数,这些函数将由exit自动//调用。我们称这些函数为终止处理程序(exithandler),并调用atexit函数来//登记这些函数,这个函数起始就是注册退出钩子函数
- Unix环境高级编程-学习-02-进程环境之进程终止、命令行参数、环境表、C程序的存储空间布局
阳光九叶草LXGZXJ
#Unix环境高级编程-学习学习c语言开发语言linuxunix
目录一、环境信息二、声明三、进程终止1、情况分类2、退出函数3、退出实验(1)main声明int和调用return值(2)main声明int和不调用return(3)main声明不int和不调用return4、atexit5、atexit实验四、命令行、环境表1、命令行2、环境表3、实验五、C程序的存储空间布局1、图示2、名词解释3、实验一、环境信息名称值CPUIntel(R)Core(TM)i5
- linux进程(三)——如何终止进程?
wwwlyj123321
嵌入式Linux应用编程
一、如何终止进程?终止一个进程大致有以下几种情况:(1)函数执行完毕,main函数正常return;(2)使用linux提供的退出进程相关的函数:exit()、_exit()、atexit()、on_exit()exit()的作用是退出当前进程,并且尽可能释放当前进程占用的资源_exit()的作用也是退出当前进程,但是不试图释放当前进程占用的资源,而且_exit()终止进程的时候不调用atexit
- python3 vsphere 虚拟机管理平台
XMYX-0
pythonvsphere
python3脚本通过pyvim调用vshphere,进行一些操作,可以对接自己的运维管理平台物理机详情虚拟机简略信息虚拟机开机虚拟机关机虚拟机详情importatexitimportdatetimefromitertoolsimportcountimportsslimporttimefrompyVim.connectimportDisconnect,SmartConnectfrompyVmomi
- C++基础问题
哦豁灬
CPPc++开发语言
1、在main函数执行之前和之后的代码可能是什么main函数执行之前,初始化系统相关资源:设置栈指针初始化static变量和global变量未初始化的全局变量赋初值全局对象初始化,这里会调用构造函数,这是可能会调用的代码将main函数的参数传递给main函数,之后开始真正的运行main函数main函数执行之后:全局对象的析构函数atexit注册的函数2、结构体内存对齐结构体内成员按照声明顺序存储,
- c语言标准库手册.pdf,C语言标准库函数查询手册(最新版).pdf
糟老頭
c语言标准库手册.pdf
C语言标准库函数查询手册(最新版).pdf王牌1C语言标准库函数龙马工作室搜集整理制作1索引Aabort10abs10absread11abswrite11acos11asctime12asin12assert13atan13atexit13atof14atoi14atol15Bbcd16biosdisk16biosprint17bsearch17Ccalloc18ceil182王牌1cgets1
- 2019-02-25
宇智波_佐助
window环境使用tab键安装pyreadlinepipinstallpyreadline第二步:在安装目录Lib目录下添加tab.pyimportsysimportreadlineimportrlcompleterimportatexitimportosreadline.parse_and_bind('tab:complete')#windowshistfile=os.path.join(os
- 设计模式
程序员爱德华
软件工程计算机体系结构设计模式
文章目录23种设计模式1.单例模式Singleton单例对象的自动释放(自动delete单例对象)的4种方式①atexit()+饿汉模式②友元类③内部类+private+static静态数据成员④pthread_once()2.编译防火墙PimplLine.hLine.cctestLine.cc3.代理模式Proxy4.适配器模式5.Reactorpattern(反应器模式)6.Proactor模
- C | atexit函数
moneymyone
Cc语言c++算法
C|atexit函数文章目录C|atexit函数atexit区别进程终止的方式Reference欢迎关注公众号“三戒纪元”atexitmain函数是整个程序的入口,但是其实可以在内核中可以使用链接器来设置程序的开始地方。当内核使用⼀个exec函数执行C程序时,在调⽤main函数之前先调用⼀个特殊的启动例程,可执行程序将此例程指定为程序的起始地址。启动例程从内核获取命令行参数和环境变量,然后为调用m
- C- atexit() 用于注册一个函数
青衫客36
Cc语言开发语言
atexit()是一个标准C库函数,它用于注册一个函数(通常称为退出处理程序或终止函数),该函数将在main()函数完成或exit()被调用时执行。这对于在程序退出时执行一些清理任务(如关闭文件、释放资源或打印一些消息)非常有用。原型#includeintatexit(void(*func)(void));参数func:指向要注册的函数的指针。这个函数不应该带有参数,并且应该返回void。返回值如
- 进程退出、僵尸进程、孤儿进程
simplehap
Linuxlinux僵尸进程孤儿进程atexit函数
1、进程退出atexit函数称为终止处理程序注册程序在Linux下manatexit就可以查看atexit的用法。函数的用法和返回值intatexit(void(*function)(void));注册函数fun1(),用atexit调用,调用了以后先不执行fun1,而是先记住,进程退出后,再运行fun1的这个函数。例如:结果:如果注册三个函数,那么注册顺序和进程退出时的退出顺序一样么?结果显示:
- int atexit(void (*func)(void))
holoyh
算法
intatexit(void(*func)(void))是一个函数原型,它用于注册一个函数,在程序正常退出时自动调用该函数。函数原型中的void(*func)(void)表示一个函数指针,它指向一个无返回值且无参数的函数。你可以将一个函数的地址传递给atexit函数,以便在程序退出时调用该函数。atexit函数的作用是在程序正常退出时执行一些清理操作或触发一些特定的操作。例如,你可以使用atexi
- PHP,安卓,UI,java,linux视频教程合集
cocos2d-x小菜
javaUIPHPandroidlinux
╔-----------------------------------╗┆
- 各表中的列名必须唯一。在表 'dbo.XXX' 中多次指定了列名 'XXX'。
bozch
.net.net mvc
在.net mvc5中,在执行某一操作的时候,出现了如下错误:
各表中的列名必须唯一。在表 'dbo.XXX' 中多次指定了列名 'XXX'。
经查询当前的操作与错误内容无关,经过对错误信息的排查发现,事故出现在数据库迁移上。
回想过去: 在迁移之前已经对数据库进行了添加字段操作,再次进行迁移插入XXX字段的时候,就会提示如上错误。
&
- Java 对象大小的计算
e200702084
java
Java对象的大小
如何计算一个对象的大小呢?
 
- Mybatis Spring
171815164
mybatis
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
CustomerService userService = (CustomerService) ac.getBean("customerService");
Customer cust
- JVM 不稳定参数
g21121
jvm
-XX 参数被称为不稳定参数,之所以这么叫是因为此类参数的设置很容易引起JVM 性能上的差异,使JVM 存在极大的不稳定性。当然这是在非合理设置的前提下,如果此类参数设置合理讲大大提高JVM 的性能及稳定性。 可以说“不稳定参数”
- 用户自动登录网站
永夜-极光
用户
1.目标:实现用户登录后,再次登录就自动登录,无需用户名和密码
2.思路:将用户的信息保存为cookie
每次用户访问网站,通过filter拦截所有请求,在filter中读取所有的cookie,如果找到了保存登录信息的cookie,那么在cookie中读取登录信息,然后直接
- centos7 安装后失去win7的引导记录
程序员是怎么炼成的
操作系统
1.使用root身份(必须)打开 /boot/grub2/grub.cfg 2.找到 ### BEGIN /etc/grub.d/30_os-prober ### 在后面添加 menuentry "Windows 7 (loader) (on /dev/sda1)" { 
- Oracle 10g 官方中文安装帮助文档以及Oracle官方中文教程文档下载
aijuans
oracle
Oracle 10g 官方中文安装帮助文档下载:http://download.csdn.net/tag/Oracle%E4%B8%AD%E6%96%87API%EF%BC%8COracle%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%EF%BC%8Coracle%E5%AD%A6%E4%B9%A0%E6%96%87%E6%A1%A3 Oracle 10g 官方中文教程
- JavaEE开源快速开发平台G4Studio_V3.2发布了
無為子
AOPoraclemysqljavaeeG4Studio
我非常高兴地宣布,今天我们最新的JavaEE开源快速开发平台G4Studio_V3.2版本已经正式发布。大家可以通过如下地址下载。
访问G4Studio网站
http://www.g4it.org
G4Studio_V3.2版本变更日志
功能新增
(1).新增了系统右下角滑出提示窗口功能。
(2).新增了文件资源的Zip压缩和解压缩
- Oracle常用的单行函数应用技巧总结
百合不是茶
日期函数转换函数(核心)数字函数通用函数(核心)字符函数
单行函数; 字符函数,数字函数,日期函数,转换函数(核心),通用函数(核心)
一:字符函数:
.UPPER(字符串) 将字符串转为大写
.LOWER (字符串) 将字符串转为小写
.INITCAP(字符串) 将首字母大写
.LENGTH (字符串) 字符串的长度
.REPLACE(字符串,'A','_') 将字符串字符A转换成_
- Mockito异常测试实例
bijian1013
java单元测试mockito
Mockito异常测试实例:
package com.bijian.study;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.
- GA与量子恒道统计
Bill_chen
JavaScript浏览器百度Google防火墙
前一阵子,统计**网址时,Google Analytics(GA) 和量子恒道统计(也称量子统计),数据有较大的偏差,仔细找相关资料研究了下,总结如下:
为何GA和量子网站统计(量子统计前身为雅虎统计)结果不同?
首先:没有一种网站统计工具能保证百分之百的准确出现该问题可能有以下几个原因:(1)不同的统计分析系统的算法机制不同;(2)统计代码放置的位置和前后
- 【Linux命令三】Top命令
bit1129
linux命令
Linux的Top命令类似于Windows的任务管理器,可以查看当前系统的运行情况,包括CPU、内存的使用情况等。如下是一个Top命令的执行结果:
top - 21:22:04 up 1 day, 23:49, 1 user, load average: 1.10, 1.66, 1.99
Tasks: 202 total, 4 running, 198 sl
- spring四种依赖注入方式
白糖_
spring
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我
- angular.injector
boyitech
AngularJSAngularJS API
angular.injector
描述: 创建一个injector对象, 调用injector对象的方法可以获得angular的service, 或者用来做依赖注入. 使用方法: angular.injector(modules, [strictDi]) 参数详解: Param Type Details mod
- java-同步访问一个数组Integer[10],生产者不断地往数组放入整数1000,数组满时等待;消费者不断地将数组里面的数置零,数组空时等待
bylijinnan
Integer
public class PC {
/**
* 题目:生产者-消费者。
* 同步访问一个数组Integer[10],生产者不断地往数组放入整数1000,数组满时等待;消费者不断地将数组里面的数置零,数组空时等待。
*/
private static final Integer[] val=new Integer[10];
private static
- 使用Struts2.2.1配置
Chen.H
apachespringWebxmlstruts
Struts2.2.1 需要如下 jar包: commons-fileupload-1.2.1.jar commons-io-1.3.2.jar commons-logging-1.0.4.jar freemarker-2.3.16.jar javassist-3.7.ga.jar ognl-3.0.jar spring.jar
struts2-core-2.2.1.jar struts2-sp
- [职业与教育]青春之歌
comsci
教育
每个人都有自己的青春之歌............但是我要说的却不是青春...
大家如果在自己的职业生涯没有给自己以后创业留一点点机会,仅仅凭学历和人脉关系,是难以在竞争激烈的市场中生存下去的....
&nbs
- oracle连接(join)中使用using关键字
daizj
JOINoraclesqlusing
在oracle连接(join)中使用using关键字
34. View the Exhibit and examine the structure of the ORDERS and ORDER_ITEMS tables.
Evaluate the following SQL statement:
SELECT oi.order_id, product_id, order_date
FRO
- NIO示例
daysinsun
nio
NIO服务端代码:
public class NIOServer {
private Selector selector;
public void startServer(int port) throws IOException {
ServerSocketChannel serverChannel = ServerSocketChannel.open(
- C语言学习homework1
dcj3sjt126com
chomework
0、 课堂练习做完
1、使用sizeof计算出你所知道的所有的类型占用的空间。
int x;
sizeof(x);
sizeof(int);
# include <stdio.h>
int main(void)
{
int x1;
char x2;
double x3;
float x4;
printf(&quo
- select in order by , mysql排序
dcj3sjt126com
mysql
If i select like this:
SELECT id FROM users WHERE id IN(3,4,8,1);
This by default will select users in this order
1,3,4,8,
I would like to select them in the same order that i put IN() values so:
- 页面校验-新建项目
fanxiaolong
页面校验
$(document).ready(
function() {
var flag = true;
$('#changeform').submit(function() {
var projectScValNull = true;
var s ="";
var parent_id = $("#parent_id").v
- Ehcache(02)——ehcache.xml简介
234390216
ehcacheehcache.xml简介
ehcache.xml简介
ehcache.xml文件是用来定义Ehcache的配置信息的,更准确的来说它是定义CacheManager的配置信息的。根据之前我们在《Ehcache简介》一文中对CacheManager的介绍我们知道一切Ehcache的应用都是从CacheManager开始的。在不指定配置信
- junit 4.11中三个新功能
jackyrong
java
junit 4.11中两个新增的功能,首先是注解中可以参数化,比如
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runn
- 国外程序员爱用苹果Mac电脑的10大理由
php教程分享
windowsPHPunixMicrosoftperl
Mac 在国外很受欢迎,尤其是在 设计/web开发/IT 人员圈子里。普通用户喜欢 Mac 可以理解,毕竟 Mac 设计美观,简单好用,没有病毒。那么为什么专业人士也对 Mac 情有独钟呢?从个人使用经验来看我想有下面几个原因:
1、Mac OS X 是基于 Unix 的
这一点太重要了,尤其是对开发人员,至少对于我来说很重要,这意味着Unix 下一堆好用的工具都可以随手捡到。如果你是个 wi
- 位运算、异或的实际应用
wenjinglian
位运算
一. 位操作基础,用一张表描述位操作符的应用规则并详细解释。
二. 常用位操作小技巧,有判断奇偶、交换两数、变换符号、求绝对值。
三. 位操作与空间压缩,针对筛素数进行空间压缩。
&n
- weblogic部署项目出现的一些问题(持续补充中……)
Everyday都不同
weblogic部署失败
好吧,weblogic的问题确实……
问题一:
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [zip:E:/weblogic/user_projects/domains/base_domain/serve
- tomcat7性能调优(01)
toknowme
tomcat7
Tomcat优化: 1、最大连接数最大线程等设置
<Connector port="8082" protocol="HTTP/1.1"
useBodyEncodingForURI="t
- PO VO DAO DTO BO TO概念与区别
xp9802
javaDAO设计模式bean领域模型
O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写。通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据。在O/R Mapping的世界里,有两个基本的也是重要的东东需要了解,即VO,PO。
它们的关系应该是相互独立的,一个VO可以只是PO的部分,也可以是多个PO构成,同样也可以等同于一个PO(指的是他们的属性)。这样,PO独立出来,数据持