楼主:
Keitaro (动き出す时间...)
2016-09-13 00:50:30开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC2008
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
MFC
问题(Question):
请问global static物件,跟static member物件,有什么差异?
补充说明(Supplement):
不好意思,小弟我想上来请教一下各位先进,关于static观念上的问题。
我看书知道static本身在程式中是唯一的,即使我把static物件放在某个class里面,
宣告N个class物件,这个static member还是只产生一个,所有物件共用。
那么我有几个关于static的疑问
1. 请问static object放在class里面跟不放class里面有什么差别?
既然所有宣告出来的class物件都共用static member object,
那跟global有什么差异呢?只为了namespace做区隔吗?
2. 关于static物件的free memory问题
我会想到用static物件是因为工作上有一个地方要重构,原本一个物件要改生成N个。
其中关于绘图的部分,MFC内建的一些像CPen/CBrush之类的物件都是一样的。
因此我才想说用static来写。
但是这样一来就衍生了对于static的问题。
由于CPen/CBrush这些class物件,生成后必须要做DeleteObject()这个动作。
原本我是把DeleteObject放在class的解构式里面。
但我现在已经把CPen宣告成static,所有物件共用,
我不能让DeleteObject()去执行N次。
因此我改写程式码为
// header
class CTestDlg
{
static CPen m_Pen;
}
// cpp
CPen CTestDlg::m_Pen;
CTestDlg::~CTestDlg()
{
if (m_Pen.GetSafeHandle()) <-加上这一行
m_Pen.DeleteObject();
}
后来我进入DeleteObject()里面看到,微软其实有做防护,
第二次以后做DeleteObject()会直接return false,所以我不加这一行也没差。
那问题来了...
a. 是否写成static member物件,如果需要做free memory,就一定要加这个判断式?
b. 如果static member物件本身不需要free memory,是否不需要对它做任何处理,
等到stack memory做free的时候自然会去call static member物件的解构式?
我先实验了b这一点,测试程式如下
// header
class CTestA
{
}
class CTestB
{
static CTestA m_A;
}
// cpp
CTestA CTestB::m_A;
CTestA::~CTestA()
{
const char str[] = "~A()";
::OutputDebugStringA(str);
}
CTestB::~CTestB()
{
const char str[] = "~B()";
::OutputDebugStringA(str);
}
int _tmain(int argc, _TCHAR* argv[])
{
CTestB Obj_B;
return 0;
}
然后我就看到印出讯息
"~B()"
"~A()"
在"~B()"印出讯息时看出程式在离开main的时候free local variable,
但是印出"~A()"的时候就看不出来stack了。
所以我猜想我对于b的猜测应该是对的?
a这点我就不知道该怎么写测试程式了。
恳请各位先进指点以上迷津,感激不尽!
作者:
Caesar08 (Caesar)
2016-09-13 01:05:00你的global是指global object还是global scope?global与static object是不会放在stack上面的喔两个都会随着process结束而呼叫destructor如果是static pointer,那只有该pointer指到的在heap所以delete要自己想办法处理
作者:
Yshuan (倚絃)
2016-09-13 01:27:00最简单事做ref count
作者:
CoNsTaR ((const *))
2016-09-13 03:36:00class 就是可以被实例化的 namespace你在 class 里宣告 static 和在同名的 namespace 里宣告static 是一模一样的在 namespace 里宣告和在 global 宣告 static 就只差在 scope所以 static member 和 global 就只差在 scope
放class里可以让用class的人access到一些固定的资讯
作者: jaid (jaid) 2016-09-14 13:55:00
与其说是namespace不如说是为了更好的封装性
其实namespace说得蛮好的吧 你要在class里面放static就等于是在namespace 里面做一样
作者: jaid (jaid) 2016-09-14 22:36:00
因为这变量还可以设定成private隐藏起来
作者:
kwpn (ITSST)
2016-09-15 12:11:00若不是private、protected,那就是意义上的差别,放class里代表变量"只"与此class相关,若不是就放global