В общем, если у вас есть класс, который наследуется от класса 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
. Тем не менее, код, кажется, работает как есть.
Есть мысли?