Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;std线程和列表分段故障(内核转储)_C++_Multithreading_List_Thread Safety_Std - Fatal编程技术网

C++ C++;std线程和列表分段故障(内核转储)

C++ C++;std线程和列表分段故障(内核转储),c++,multithreading,list,thread-safety,std,C++,Multithreading,List,Thread Safety,Std,我是多线程新手,我将在线程中传递一个列表 我希望一个线程可以添加一个字符串,而另一个线程将删除一个字符串 我不知道如何通过这个名单 这是我代码的一部分,它出现了分段错误(内核转储) 与 但是它仍然是相同的itemE::add是线程的主体,在这个函数成员中,您在bkName列表上调用push_back,但是这个对象没有被构造-您得到了分段错误 malloc函数只分配内存。调用此行malloc(sizeof(BOOK))只分配了sizeof(BOOK)字节,但未调用bookName成员的构造函数。您

我是多线程新手,我将在线程中传递一个列表

我希望一个线程可以添加一个字符串,而另一个线程将删除一个字符串

我不知道如何通过这个名单

这是我代码的一部分,它出现了分段错误(内核转储)


但是它仍然是相同的

itemE::add
是线程的主体,在这个函数成员中,您在
bkName
列表上调用
push_back
,但是这个对象没有被构造-您得到了分段错误

malloc
函数只分配内存。调用此行
malloc(sizeof(BOOK))
只分配了
sizeof(BOOK)
字节,但未调用
bookName
成员的构造函数。您应该使用
new
来分配内存和构造图书对象

itemE():
    bookList(new BOOK)
{
  ...

新书
中,将调用
列表bookName
的默认构造函数,然后您可以在此成员上使用exmaple
push_back

考虑改用lambda

itemE()
 :bookList(new BOOK)
{
    count = 0;
    m_addThread = thread([this]() { add(bookList->bookName); });  

}  

1.如果你有一个核心文件,看看它。它们不仅仅是为了浪费您的磁盘空间,还应该帮助您进行调试。2.
std::thread
构造函数的第一个参数是可调用的。您的成员函数是可常规调用的吗?当你从你的类外部调用它时,语法看起来是什么样子?问题不在<代码>线程< /代码>,而是< C++ >代码> > MulcC 函数和<代码>书名> BookNAME> /COD>,<代码> BookNAME< /COD>未创建MLALC,使用新分配内存并构造对象。如果你没有做一些高级的事情,比如写你自己的分配器,那么你几乎肯定是做错了。谢谢你提醒我调试方法,我会尝试一下,然后分享结果,你真的帮了我很多!!我买了一本新书后,忘了接我的线。但通过阅读核心文件和谷歌,我找到了它,它工作了!啊,我没注意到@OP-在尝试创建多线程之前,学习正确编写单线程代码。在尝试任何复杂的东西之前,这是你应该理解的最基本的东西。
void add(BOOK* bk)
{
    ...
        bk->bookName.push_back(name);
    ...
}
itemE():
    bookList(new BOOK)
{
  ...
itemE()
 :bookList(new BOOK)
{
    count = 0;
    m_addThread = thread([this]() { add(bookList->bookName); });  

}