單件模式比較簡單
最常用的寫法,子類繼承它既可。
template
class csingleton
return *pinstance_;
}private:
static t* pinstance_;
protected:
csingleton(void)
;template
t* csingleton::pinstance_ = null;
該寫法有個問題,instance_是沒有析構了,只有退出應用程式,靠作業系統去**
改進方案:
將instance申明為static,依賴於c++的語言機制去**
該方案比較簡單,但是也有個小問題,如果單件**有順序要求,那就不可控了,static對於c++語言要求的析構順序是:先申明的後析構。
可以使用一種其它方案:在程式退出main中,可以增加乙個函式指標,這個函式指標會在exit中進行呼叫。我們對每個單件申明乙個壽命期的變數,壽命期越長的,越晚析構。
其實就是將它儲存到vector中,然後依次從vector中取單件物件進行析構,壽命期越晚的,放到越後面
lifetimertracker.h的實現
#pragma once
#include
#include
#include
#include
//using namespace std;
// 帶壽命的singletons
class lifetimetracker
;inline lifetimetracker::~lifetimetracker(){}
bool mycompare(const lifetimetracker* pleft, const lifetimetracker* pright);
typedef lifetimetracker** trackerarray;
extern trackerarray ptrackerarray;
extern unsigned int elements;
//template
void delete(t* pobj)
//template
class concretelifetimetracker: public lifetimetracker
~concretelifetimetracker()
private:
t* ptracked_;
destroyer destroyer_;
};void atexitfn();
template
void setlongevity(t* pdynobject, unsigned int longevity, destroyer d = delete)
ptrackerarray = pnewarray;
lifetimetracker* p = new concretelifetimetracker(pdynobject, longevity, d);
// 用到了乙個排序
trackerarray pos = std::upper_bound(ptrackerarray, ptrackerarray + elements, p, mycompare);
std::copy_backward(pos, ptrackerarray + elements, ptrackerarray + elements + 1);
*pos = p;
++elements;
_atexit(atexitfn);
}lifetimertracker.cpp的實現
#include "stdafx.h"
#include "lifetimertracker.h"
trackerarray ptrackerarray;
unsigned int elements;
void atexitfn()
bool mycompare(const lifetimetracker* pleft, const lifetimetracker* pright)
簡單的測試**
class ctestsingle
ctestsingle* pinstance2 = new ctestsingle;
setlongevity(pinstance2, 2, delete);
}private:
static ctestsingle* pinstance_;
int i;
};ctestsingle* ctestsingle::pinstance_ = null;
void bar()
void fun()
void ctestsingleton::test()
mysql第六章 第六章 mysql日誌
第六章 mysql日誌 一 錯誤日誌 錯誤日誌的預設存放路徑是 mysql 存放資料的地方 hostname.err 1.修改錯誤日誌存放路徑 mysqld log error data mysql mysql.log 2.檢視配置命令 show variables like log error 3...
第六章 指標
1.多位元組資料的位址是在最左邊還是最右邊的位置,不同的機器有不同的規定,這也正是大端和小端的區別,位址也要遵從邊界對齊 2.高階語言的乙個特性就是通過名字而不是位址來訪問記憶體的位置,但是硬體仍然通過位址訪問記憶體位置 3.記憶體中的變數都是義序列的0或1的位,他們可以被解釋為整數或者其他,這取決...
第六章總結
6.1 使用滑鼠 6.1.1 滑鼠時間和滑鼠訊息 根據使用者操作滑鼠時滑鼠的位置,滑鼠訊息分為兩類 客戶區滑鼠訊息和非客戶區滑鼠訊息。1.客戶去滑鼠訊息 2.當滑鼠游標位於視窗的使用者區時,將生成客戶滑鼠訊息。滑鼠訊息和鍵盤訊息有所不同,windows 只將鍵盤有訊息傳送給具有輸入極點的視窗,但滑鼠...