2008年4月1日 星期二

從 Java 到 C 的嚴重使用錯誤

    這陣子寫了一堆 C 的 func  搞了一點 point 的東東
    其中有件事讓我印象很深  特別記一下

    由於前一次開發較大型的系統是使用 Java
    我在 Java 上習慣設計一些很方便的 function  在此以數字加減運算當做例子

        String getValueByI( int x );    // 傳入整數  轉換成字串回傳
        int getValueByS( String s );    // 傳入字串  轉換成整數回傳

    如此  我可以使用

        String result = getValueByI( getValueByS( "5566" ) + 7788 );

    這樣我可以方便地做數字跟字串的轉換和運算  結果我在 C 這邊使用:

        uchar* getValueByI( int x );
        int getValueByS( uchar* s );

    使用:

        uchar * result = getValueByI( getValueByS( "5566" ) + 7788 );

    其實看上面一次好像沒什麼錯  來跑個迴圈吧

    uchar* getValueByI( int x ){
        uchar* tmp;
        tmp = malloc( sizeof(uchar) * 10 );
        sprintf( tmp , "%d" , x );
        tmp[9] = '\0';
        return tmp;
    }
    int main(){
        uchar* result, *tmp;
        while( 1 ){
            if( tmp == NULL )
                result = getValueByI( getValueByS( "5566" ) + 7788 );
            else
                result = getValueByI( getValueByS( tmp ) + 7788 );
            tmp = result;
        }
        return 0;
    }

    如此一來 tmp 之前所指的空間  會一直忘記 free 掉
    只是不斷地接另一個新的空間
    出錯的問題很簡單  那就是我在 getValueByI 裡進行 malloc 來回傳出來
    這個用法我覺得很直觀  但其實 C 並沒有 Java 的 garbage collection
    所以更正確的用法是用完必須 free 掉  特別是開發給 Server 用的
    結果我一連寫了10個 function 都是這種 style 囧rz
    這下不知要改多少啊  XD


沒有留言:

張貼留言