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 則留言:
看起來不是class的問題而是pointer的問題..
張貼留言