C++ 空指针

Posted

技术标签:

【中文标题】C++ 空指针【英文标题】:C++ void pointers 【发布时间】:2017-04-07 07:17:28 【问题描述】:
pthread_mutex_t mutexREAD;
int main(int argc, char *argv[])
    pthread_t READERthreads;
    pthread_mutex_init(&mutexREAD, NULL);
    string *fname;
    cin>> *fname;
    pthread_create(&READERthreads, NULL, reader_thread, (void*) fname);

void *reader_thread(void *param)
    string fname = *(string *) param;
    cout<<"filename is "<< fname<<endl;
    ifstream myfile(fname.c_str());
    return NULL;
 

上面的代码抛出分段错误。我可能搞砸了我的指针,但我不知道哪里出了问题,我该如何解决?

【问题讨论】:

这里:cin&gt;&gt; *fname 【参考方案1】:

两个问题:崩溃的第一个也是可能的原因是您有一个指针fname,但它实际上并没有指向任何地方。当您取消引用它时,这会导致 未定义的行为

除非需要将不同的字符串传递给不同的线程,不需要是指针,调用pthread_create时使用地址运算符&amp;即可。

你当然可以改用std::thread,按值传递字符串,完全不用担心指针:

...
std::string fname;
std::cin >> fname;

std::thread READERthread&reader_thread, fname);
READERthread.join();
...

void reader_thread(std::string fname)

    ...


第二个问题是您在退出进程之前没有等待线程完成。那将杀死线程。您要么需要加入线程,等待它退出。或者你可以分离它,只退出主线程(而不是进程),让另一个线程在后台运行。

【讨论】:

【参考方案2】:

您声明了一个指向string 的指针,只需使用string 并传递它的地址。

pthread_mutex_t mutexREAD;
int main(int argc, char *argv[])
    pthread_t READERthreads;
    pthread_mutex_init(&mutexREAD, NULL);
    string fname;
    cin>> fname;
    pthread_create(&READERthreads, NULL, reader_thread, (void*) &fname);
    pthread_join(&READERthreads,NULL);

void *reader_thread(void *param)
    string fname = *(string *) param;
    cout<<"filename is "<< fname<<endl;
    ifstream myfile(fname.c_str());
    return NULL;
 

另一个问题是你不等待线程终止,那么堆栈分配的字符串可能会在线程有时间使用它之前被释放......在生成线程中使用pthread_join

【讨论】:

以上是关于C++ 空指针的主要内容,如果未能解决你的问题,请参考以下文章

带有空指针的 2D 指针数组 c++

c++异步回调函数引用传递空指针异常

C++ 空指针

在 C++ 中删除空指针是不是被认为是未定义的行为? [复制]

什么是 C++ 中的空指针? [复制]

不评估应用了 sizeof 的表达式是不是使得在 C++ 中取消引用 sizeof 内的空指针或无效指针是合法的?