当对象在无限循环中被摧毁时会发生什么?

时间:2013-08-07 23:39:02

标签: c++ linux while-loop destructor infinite-loop

我想知道当对象被卡在另一个线程中的无限while循环中时,在对象上调用析构函数时会发生什么。

// Main thread creates the object
MyClass _obj = new MyClass():
// doing some stuff
delete _obj;

其中,

MyClass::MyClass()
{
 // Start a thread which calls MyClass::MyPollingFn()
}

MyClass:: MyPollingFn()
{
  // runs in new child thread
  while(true)
  {
    // doing some work
    // sleep(5 seconds)
  }
}

说明: MyClass有一个类对象,它创建一个线程并在无限循环中运行MyPollingFn方法。此方法的每次迭代都可以更改某些类变量。是否可以从保存对象的父线程中销毁对象?是否有可能出现问题?

2 个答案:

答案 0 :(得分:1)

如果MyPollingFn显式或隐式地(例如通过访问非静态成员变量)触及this,则此代码将显示未定义的行为,因为this将成为悬空指针

如果它没有触及this,那么为什么要使它成为非静态成员函数呢?

答案 1 :(得分:0)

有几个可能的问题,包括
1.你要么试着加入你的析构函数中的线程,在这种情况下它会阻塞。


修改

即。如果你添加

MyClass::~MyClass()
{
  myThread.join();
}

并按原样保留MyPollingFunction,它永远不会完成,因此join会阻止。

结束修改


虽然这段代码没有析构函数,但也许它应该。

2.或者线程将在类消失后尝试“更改某些类变量”。 这显然很糟糕。
改变

可能更好
while(true)

while(!finished)

其中,finish是某种线程安全标志(例如atomic)并将其设置在(当前不存在的)析构函数中。