2011-12-05 89 views
2

的內容我有複製的結構內容的問題.. 以下情況...我有一個結構arg_struct在我的班級會議:C++複製結構

struct Session::arg_struct 
{ 
    const char* targetFilePath; 
    const char* url; 
    unsigned int thread_id; 
    Session::ThreadFinishedCallbackFunction callback; 
}; 

,並在我的方法之一我啓動一個線程,並給予結構,以將要執行的功能:

{ 
... 
arg_struct args; 
args.targetFilePath = targetFilePath; 
args.url = req_url; 
args.thread_id = ++mThread_id; 
args.callback = callback; 

curl_global_init(CURL_GLOBAL_ALL); 

error = pthread_create(&thread,NULL,download,&args); 

} 

現在下載功能將被執行:

void* download(void* arguments) 
{ 

Session::arg_struct ar = *(Session::arg_struct*) arguments; 
Session::arg_struct args; 
args.targetFilePath = new char[strlen(ar.targetFilePath)]; 
args.url = new char[strlen(ar.url)]; 
strcpy(const_cast<char*>(args.targetFilePath),ar.targetFilePath); 
strcpy(const_cast<char*>(args.url),ar.url); 
args.callback = ar.callback; 
args.thread_id = ar.thread_id; 
cout << "copied" << endl; 
CURL *curl; 
FILE* datafile; 

datafile = fopen(args.targetFilePath, "w"); 

if(datafile != NULL) 
{ 

    curl = curl_easy_init(); 
    curl_easy_setopt(curl,CURLOPT_URL,args.url); 
    curl_easy_setopt(curl,CURLOPT_WRITEDATA,datafile); 
    curl_easy_perform(curl); 
    curl_easy_cleanup(curl); 
    fclose(datafile); 

} else { 
    cout << "error: failed to open file!" << endl; 
    return NULL; 
} 

在下載函數的開始我複製結構(我quess;)),但我得到的文件無法打開的錯誤。問題是,當我嘗試用fopen()打開文件時,結構是空的。看來我沒有正確地複製結構,或者指向struct(void * arguments)的指針已經不可用。你有什麼建議嗎?

+0

new char [strlen(ar.url)]是錯誤的。您需要爲空終止符添加1。 –

回答

5

它看起來好像是當你創建結構時,你正在堆棧上做它。當該函數返回時,其堆棧消失,結構也一樣。在我看來,下載之前,結構將消失,有機會複製它。

相反,您應該在堆上分配結構(使用新的),並在下載時解除分配它。另外,由於下載將取得它的所有權,您不必複製它。

+0

謝謝我會試試這個;) –

3

有兩種副本:

  • 淺拷貝
  • 深層複製

閱讀:

如果你需要淺拷貝,那麼這就夠了,

arg_struct shallow_copy = original; 

不需要複製每個元素。

但是,如果你需要深拷貝,那麼你必須爲指針結構的成員分配內存,然後使用strcpy複製內容,不使用分配。由於這是繁瑣的方法,因此應將這些變量的類型從char*更改爲std::string。然後你可以簡單地寫:

​​

現在這是深拷貝。它只需要將指針更改爲std::string即可。