静态成员变量的初始化及析构顺序

sharpsword 2005-01-30 01:43:58
一个项目中不同文件中的静态成员变量是按什么顺序构造和析构的呢?

// A.cpp
A * A::instance;
AutoPtr<A> A::ptr(A::instance); //............1

A::A()
{

}
A::~A()
{

}

// B.cpp
B * B::instance;
AutoPtr<B> B::ptr(A::instance); //............2

B::B()
{

}
B::~B()
{

}

上例中1和2哪个先被构造呢?是否和文件包含有关?
...全文
796 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
healer_kx 2005-01-31
  • 打赏
  • 举报
回复
应该是连接的顺序决定了析构顺序, 先链接的就后析构吧.

我觉得也不是一个什么困难的事情, 做好编程习惯.
指针释放后设为NULL.
是不是要释放某指针的时候要判断其是否为NULL.

它们的析构函数写好了, 这些析构的顺序不久是你控制了.
redleaves 2005-01-31
  • 打赏
  • 举报
回复
没有什么好办法,如果你非要那么写,唯一的解决方案就是手工调整连接顺序.

写程序要尽量避免在构造函数中做过多的事,因为构造函数可能在main函数之前运行,很多时候它的行为不好控制.
如果非要用,尽量把所有静态对象的定义放到一起.

要不,在一般情况下可以用如下方式代替:
int &GetObj(void) {
static int a;
return a;
}
sunshangjun 2005-01-30
  • 打赏
  • 举报
回复
顶一下
melonliu 2005-01-30
  • 打赏
  • 举报
回复
学习
qinxiaolin 2005-01-30
  • 打赏
  • 举报
回复
自己写个构造函数运行看看就知道了!!
dongpy 2005-01-30
  • 打赏
  • 举报
回复
学习!
playmud 2005-01-30
  • 打赏
  • 举报
回复
关注!
dongyuanzhang 2005-01-30
  • 打赏
  • 举报
回复
没有固定顺序,除非显示在构造函数体内初始化。
zhengwei1984222 2005-01-30
  • 打赏
  • 举报
回复
对对,是link时确定顺序,想起了,楼上说得对
sharpsword 2005-01-30
  • 打赏
  • 举报
回复
redleaves(ID最吊的网友)
那怎么办? 你一般是怎么解决的呢?
zhengwei1984222 2005-01-30
  • 打赏
  • 举报
回复
静态成员变量的构造和初始化是在程序进入点《main函数》之前
析构在main()函数退出之前
至于顺序,我想和各个文件的编译顺序有关,没必要计较吧
redleaves 2005-01-30
  • 打赏
  • 举报
回复
是按链接的顺序
如果 link a.obj b.obj....
则a.cpp中的先初始化
如果 link b.obj a.obj....
则b.cpp中的先初始化

如果你在一个静态对象的构造函数中使用其它静态对象,你就要十分小心.项目中文件一多,几乎是必错.

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧