构造与析构 && static 问题

来源:互联网 发布:辽宁体育频道哪个软件 编辑:程序博客网 时间:2024/05/01 15:09
----记录一下,其中的痛只有经历的才知道。。。。

#include <iostream>
using namespace std;
typedef struct _tagStaticTextConfig
{
          _tagStaticTextConfig()
          {
                   Height = 0;
                   cout << "_tagStaticTextConfig constructor" << endl;

          }
          ~_tagStaticTextConfig()
          {
                   cout << "_tagStaticTextConfig destructor" << endl;
          }
           int Height;
}StaticTextConfig;
class CWinUtilityControl
{
public:
          CWinUtilityControl() {cout << "CWinUtilityControl constructor" << endl;  }
           virtual ~CWinUtilityControl(){ cout << "CWinUtilityControl destructor " << endl; }
           static int test;
};

class CSQLoginWnd :public CWinUtilityControl
{
public:
          CSQLoginWnd( void) {cout << "CSQLoginWnd contructor " << endl; };
           virtual ~CSQLoginWnd(void ){cout << "CSQLoginWnd destructor " << endl; }

           //bool create();
           static CSQLoginWnd* init();

protected:

           public:
           static StaticTextConfig* m_STChelp;  //STC:StaticTextConfig 
           static CSQLoginWnd* m_SharedSQLoginWnd;
};
  

#include <string>
#include <iostream>
#include <tchar.h>
#include "resource1.h"


CSQLoginWnd* CSQLoginWnd::init()
{
           if (!m_SharedSQLoginWnd)
          {
                   m_SharedSQLoginWnd = new CSQLoginWnd();
                   m_STChelp = new StaticTextConfig();
                   CSQLoginWnd::m_STChelp->Height = 100;
                    return m_SharedSQLoginWnd;
          }
           return m_SharedSQLoginWnd;
}

CSQLoginWnd* CSQLoginWnd::m_SharedSQLoginWnd = NULL;
StaticTextConfig* CSQLoginWnd::m_STChelp = NULL;

int main()
{
          //CSQLoginWnd::k = 0; error
          CSQLoginWnd* pwindow = CSQLoginWnd::init();

           delete pwindow;

           if (!CSQLoginWnd::m_SharedSQLoginWnd)
          {
                   cout << "shareSQLLoginWnd is Null" << endl;
          } else{
                   cout << CSQLoginWnd::m_STChelp->Height << endl; //数据还存在;
          }
          getchar();
          
           return 0;
}
-------总结
// 1.static 的成员一定要在main前定义;(放在全局空间上)
//2.(就算手动)del了空间但是static成员的空间没有释放;
//3.CSQLoginWnd* pwindow; 只是定义指向CSQLoginWnd空间大小的指针(大小还是4字节),如果不初始化,就来一句pwindow->k = 1;  那是肯定有问题的; 它指向的空间内没有K这个标志;所以要它正确,必须指向已经初始化的空间;当然,构造空间,与析构空间就不关它的事情了,就是说它只负责“依序寻访聚合物(容器)的东西”;空间的构造交给构造函数和析构函数,什么时候调用:如果是在堆上就需手动调用del。 如果是栈上;越界后它会自动释放这聚合物空间,而这指向聚合物的指针呢?如果它是分配在栈上的,越界后它也会没有意义;你还担心影响到聚合物空间,不用担心,就算释放也就释放指针它自己的4字节空间;如果他分配在堆上(再次提醒是4字节在堆上),它就一直存在(如上例子);

0 0
原创粉丝点击