2010年8月22日 星期日

class奇怪的問題

遇到一個奇怪的問題 有個class SIFT這樣宣告,裡面有個data member all_descriptor
class SIFT{ 
public: 
    vector < descriptor > all_descriptor; 
    run();
}; 

然後主程式這樣寫

void store_descriptor(SIFT *sift, const int files, char *filename)
{    
    for(int file=0; file<files; file++)
    {
        cout << sift[file].all_descriptor.size() << endl;
    }
}
 
void run_SIFT(SIFT *sift, const int files)
{    
    sift = new SIFT[files];    
    for(int file=0; file<files; file++)    
    {
        sift[file].run();    
    }    
}
 
int main(void)
{    
    SIFT *sift = NULL;    
    run_SIFT(sift, files); 
    store_descriptor(sift, files, “filename”);    

    return 0;
}

結果跑到store_descriptor的時候,sift[file].all_descriptor就變空的了,用debuger一行一行跑發現跳出run_SIFT之後sift[files]裡面的SIFT物件都變空的了,就像呼叫了deconstructor一樣,可是new的東西跳出function也會自動呼叫deconstructor嗎?

===========================================================================


查了PTT後發現原來是觀念錯誤,傳進run_SIFT的pointer,在new後位址沒有留給外面
就像
void getMem(char *ptr)
{
    ptr = (char*)malloc(100);
}
main()
{
    char *str = NULL;
    getMem(str);
    strcpy(str, "Hello C/C++ programming");
    printf("%s\n", str);
}
是錯的,但是
void getMem(char **ptr, int num)
{
    *ptr = (char*)malloc(200);
}
main()
{
    char *str = NULL;
    getMem(&str, 200);
    strcpy(str, "Hello C/C++ programming");
    printf("%s\n", str);
}
就可以了。

所以之前的程式可以改成
SIFT * run_SIFT(SIFT *sift, int files)
{
    sift = new SIFT[files];

    return sift;
}
就可以了

1 則留言:

wilson 提到...

看起來不是class的問題而是pointer的問題..