一般来说,如果你有一个类继承自一个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
方法的对象。但是,代码似乎按原样工作。
有什么想法吗?