一般来说,如果你有一个类继承自一个Thread类,并且你希望该类的实例在它们完成运行后自动释放,可以delete this吗?
具体例子:
在我的应用程序中,我有一个Timer类,其中包含一个static名为schedule. 用户这样称呼它:
Timer::schedule((void*)obj, &callbackFunction, 15); // call callbackFunction(obj) in 15 seconds
该schedule方法创建一个Task对象(其目的类似于 Java TimerTask 对象)。类Task属于private类Timer并继承自Thread类(使用 pthreads 实现)。所以该schedule方法这样做:
Task *task = new Task(obj, callback, seconds);
task->start(); // fork a thread, and call the task's run method
构造Task函数保存参数以在新线程中使用。在新线程中,任务的run方法被调用,如下所示:
void Timer::Task::run() {
Thread::sleep(this->seconds);
this->callback(this->obj);
delete this;
}
请注意,我不能使该task对象成为堆栈分配的对象,因为新线程需要它。另外,我已将Task课程private设置为Timer课程以防止其他人使用它。
我特别担心,因为删除Task对象意味着删除底层Thread对象。Thread对象中的唯一状态是pthread_t变量。有什么办法可以回来咬我吗?请记住,方法完成后我不使用该pthread_t变量。run
delete this我可以通过引入某种状态(通过Thread::start方法的参数或构造函数中的某些东西)来绕过调用,Thread这表明被分叉的方法应该delete是它正在调用该run方法的对象。但是,代码似乎按原样工作。
有什么想法吗?