2011-12-05 48 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即可。