我正在使用以下代码
class foo
{
private:
int val;
public:
void someMethod()
{
std::cout << val ;
}
foo()
{
val = 12;
boost::thread t(&foo::someMethod,this);
}
};
我正在访问此课程:
foo f;
根据我的理解,f的所有成员变量都是在堆栈上创建的。 从this线程我明白线程共享程序的同一堆,但每个线程都有自己的堆栈空间。我想知道在自己的线程中运行的someMethod()如何访问类变量。
答案 0 :(得分:2)
您正在将this
指针传递给线程。一个指针,可以指向任意位置,在这种情况下,它将指向堆栈。这在理论上有效,但非常不安全。
请考虑以下代码:
if (...)
{
foo f;
}
会发生什么?
foo
实例在堆栈上初始化foo*
开头f
被破坏/删除,并且包含它的空间(堆栈)可能被解除分配。现在虽然线程可以在几秒钟内完美运行,但在那个小小的时间之后你会遇到很大的麻烦,因为线程使用的this
指针现在无效。非常糟糕!