12/11/2009

Invoke pure virtual function

沒錯 你沒看錯
這篇的標題是呼叫純虛擬函式
一個沒有實作的純虛擬函式是有可能被呼叫起來的
class A {
public:
    virtual void f(void) = 0;
};
class B : public A {
    virtual void f(void) {}
};
在系統開發中 這是一個很常出現的程式片斷
在多型體系中
A* a = new B;
a->f();
因為vtable的存在 程式會為f找尋合適的function pointer並呼叫
這例子中從vtable中會找到class B中的f()
這並沒有甚麼問題
那麼如果vtable中沒有class B的資訊時會怎麼樣 那就會找到class A的f()
就會呼叫純虛擬函式了

這會發生嗎?
會的
class A;
class A {
public:
    virtual ~A() { m_pA->Close(); }
    virtual void Close(void) = 0;
    A* m_pA;
};
class B : public A {
    virtual void Close(void) {}
};
像這樣的程式
一般人會想說把所有的CloseXXX, DeleteXXX, DestoryXXX寫在解構子
解構子被呼叫的順序是從下而上
所以B的解構子先呼叫 把vtable清掉
A的解構子再呼叫 這時vtable中只有class A 所以就呼叫一個純虛擬函式了

當然 Effective C++裡提到 不應該在解構子呼叫虛擬函式 會有類似的問題出現
而在多執行緒中 也可能發生
class B : public A {
    virtual void f(void) {}
    void ThreadProc() {
        while(1)
            f();
    }
};

void main() {
    A* a = new B();

    while(1) {
        if (...)
            a->Create();
        if (exception == true)
            break;
    }
    delete a;
}
我們把class B改為一個thread 它會不斷的呼叫f()
當一個執行緒因為例外發生或其他原因 使物件的解構子被呼叫
呼叫到一半的時候 另一個執行緒呼叫該物件的虛擬函式
剛好解構到vtable只剩下Base class時 就會呼叫純虛擬函式了

11/19/2009

說謊

主唱:林宥嘉
詞:施人誠
曲:李雙飛

是有過幾個不錯對象 說起來並不寂寞孤單
可能我浪蕩 讓人家不安
才會 結果都陣亡

我沒有什麼陰影魔障 妳千萬不要放在心上
我又不脆弱 何況那算什麼傷
反正愛情不就都這樣

我沒有說謊 我何必說謊
妳懂我的 我對妳從來就不會假裝
我哪有說謊
請別以為妳有多難忘 笑是真的不是我逞強

我好久沒來這間餐廳 沒想到已經換了裝潢
角落那窗口 聞得到玫瑰花香
被妳一說是有些印象

我沒有說謊 我何必說謊
妳知道的 我缺點之一就是很健忘
我哪有說謊
是很感謝今晚的相伴 但我竟然有些不習慣

我沒有說謊 我何必說謊
愛一個人 沒愛到難道就會怎麼樣
別說我說謊
人生已經如此的艱難 有些事情就不要拆穿

我沒有說謊 是愛情說謊
它帶妳來 騙我說 渴望的有可能有希望
我沒有說謊
祝妳做個幸福的新娘 我的心事請妳就遺忘

7/28/2009

C/C++ with MySQL

最近一直找一個bug 找很久都找不出來

狀況是這樣子

在一台linux上裝上 MySQL 5.0, Apache 2.0, django 1.0, openssl 5.5.2

建立一台有網頁 有cgi 有ssl的平台

之後複製另一台成master and slave 同時使用 MySQL Replication

令兩台資料庫保持一致狀態 作為master掛掉時自動起來的back up server

問題來了 它們總是不一致

測了很久發現我c++的cgi使用Connector/C++ 1.0 Preview來連接MySQL 但不會產生MySQL的binary log

沒有binary log就沒辨法使用MySQL Replication

後來

花了個晚上把Connector/C++換成MySQL++


看來兩套功能相同的東西 還是選版本比較大的好 = ="

7/27/2009

摸索

半年來
每天不斷的上班 上班 除了上班還剩甚麼
每天趨於平淡 盲目
我想要的生命似乎漸漸地從手中流失
就這樣嗎?
我的生活需要點不一樣的 需要點衝擊

7/25/2009

The Show

http://www.youtube.com/watch?v=hnN30rs5NkQ
十分值得聽的歌 澳洲的創作女歌生 lenka
The Show

I'm just a little bit
caught in the middle
Life is a maze
and love is a riddle
I don't know where to go
I can't do it alone
(I've tried)
and I don't know why
its cuz jollys cool

Slow it down
make it stop
or else my heart is going to pop
'cuz it's too much
Yeah, it's a lot
to be something I'm not

I'm a fool
out of love
'cuz I just can't get enough

I'm just a little bit
caught in the middle
Life is a maze
and love is a riddle
I don't know where to go
I can't do it alone
(I've tried)
and I don't know why

I am just a little girl
lost in the moment
I'm so scared
but I don't show it
I can't figure it out
it's bringing me down
I know
I've got to let it go
and just enjoy the show

The sun is hot
in the sky
just like a giant spotlight
The people follow the sign
and synchronize in time
It's a joke
Nobody knows
they've got a ticket to that show
Yeah

I'm just a little bit
caught in the middle
Life is a maze
and love is a riddle
I dont know where to go
I can't do it alone
(I've tried)
and I don't know why

I am just a little girl
lost in the moment
I'm so scared
but don't show it
I can't figure it out
it's bringing me down
I know
I've got to let it go
and just enjoy the show

oh oh
Just enjoy the show
oh oh

I'm just a little bit
caught in the middle
life is a maze
and love is a riddle
I dont know where to go
I can't do it alone
(I've tried)
and I don't know why

I am just a little girl
lost in the moment
I'm so scared
but I don't show it
I can't figure it out
it's bringing me down
I know
I've got to let it go
and just enjoy the show

dum de dum
dudum de dum

Just enjoy the show

dum de dum
dudum de dum

Just enjoy the show

I want my money back
I want my money back
I want my money back
Just enjoy the show

I want my money back
I want my money back
I want my money back
Just enjoy the show