簡體   English   中英

C ++復制結構內容

[英]C++ copy content of structure

我有一個復制結構內容的問題..以下情況......我的類Session中有一個struct arg_struct:

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;
}

在下載函數的開頭我復制struct(I quess;))但是我得到了無法打開文件的錯誤。 問題是,當我嘗試用fopen()打開文件時,struct是空的。 似乎我沒有正確復制結構,或者指向struct(void * arguments)的指針已經無法使用。 你有什么建議嗎?

看起來,當您創建結構時,您正在堆棧上執行它。 當該函數返回時,它的堆棧就會消失,結構也會消失。 在我看來,在下載有機會復制之前,結構就會消失。

相反,您應該在堆上分配結構(使用new),並在下載時釋放它。 此外,由於下載將取得它的所有權,你不必真正復制它。

有兩種副本:

  • 淺拷貝
  • 深拷貝

讀這個:

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

arg_struct shallow_copy = original;

無需復制每個元素。

但是,如果需要深層復制,則必須為結構的指針成員分配內存,然后使用strcpy復制內容 ,而不是使用賦值。 由於這是一種繁瑣的方法,因此最好將這些變量的類型從char*更改為std::string 然后你可以簡單地寫:

   arg_struct deep_copy = original;

現在這是深刻的副本。 它只需要你改變指向std::string的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM