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
的默认构造函数,然后您可以在此成员上使用exmaplepush_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); });
}