我有以下代码获取核心转储错误。每个C实例创建自己的线程然后运行。我猜静态函数和类参数有问题" count"。当我注释掉打印它的代码时,没有发生错误..
#include <iostream>
#include <pthread.h>
using namespace std;
class C {
public:
int count;
C(int c_): count(c_){}
public:
void *hello(void)
{
std::cout << "Hello, world!" <<std::endl;
std::cout<<count; // bug here!!!
return 0;
}
static void *hello_helper(void *context)
{
return ((C *)context)->hello();
}
void run() {
pthread_t t;
pthread_create(&t, NULL, &C::hello_helper, NULL);
}
};
int main() {
C c(2);
c.run();
C c2(4);
c2.run();
while(true);
return 0;
}
答案 0 :(得分:1)
决定写一个答案。根据您创建主题的方式,您使用hello_helper
context
来NULL
调用count
。 C ++完全允许您在空指针上调用成员函数,除非访问成员元素,否则不会发生错误。
在您的情况下,通过添加行来打印#include <iostream>
class Rebel
{
public:
void speak()
{
std::cout << "I DO WHAT I WANT!" << std::endl;
}
};
int main()
{
void * bad_bad_ptr = NULL;
((Rebel*)bad_bad_ptr)->speak();
}
。您现在正在访问空指针上的成员变量,这是一个很大的禁忌。
以下是您逃避的例子:
I DO WHAT I WANT!
输出:
pthread_create
通过修改this
调用以传递pthread_create(&t, NULL, &C::hello_helper, this);
指针(即Declare @YourTable Table (ID int,YourField varchar(500))
Insert Into @YourTable values
(1,'bob hope deloris steve mike'),
(2,'melbob melbetty steve')
Select A.ID
,AnswerA = Count(*)
,AnswerB = Sum(case when RetVal Like 'mel%' then 1 else 0 end)
From @YourTable A
Cross Apply (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>'+ Replace(A.YourField,' ','</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
) B
Group By ID
),您现在拥有一个有效的实例来访问成员变量。
答案 1 :(得分:-1)
我通过在创建线程时将此指针传递给NULL来解决问题。我猜os在前一种情况下两次创建了相同的线程?