C ++复制结构内容

时间:2011-12-05 16:37:52

标签: c++ multithreading

我在复制结构内容时遇到问题。 以下情况......我的课程会话中有一个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)的指针已经无法使用。你有什么建议吗?

2 个答案:

答案 0 :(得分:5)

看起来好像在创建结构时,你是在堆栈上进行的。当该函数返回时,它的堆栈就会消失,结构也会消失。在我看来,在下载有机会复制之前,结构就会消失。

相反,您应该在堆上分配结构(使用new),并在下载时释放它。此外,由于下载将取得它的所有权,你不必真正复制它。

答案 1 :(得分:3)

有两种副本:

  • 浅拷贝
  • 深层复制

阅读本文:

如果你需要浅拷贝,那就足够了,

arg_struct shallow_copy = original;

无需复制每个元素。

但是,如果您需要深层复制,则必须为结构的指针成员分配内存,然后使用strcpy复制内容,没有使用任务。由于这是一种繁琐的方法,因此最好将这些变量的类型从char*更改为std::string。然后你可以简单地写一下:

   arg_struct deep_copy = original;

现在这是深层复制。它只需要您将指针更改为std::string