2

libuv イベント ループにタスクをスケジュールする必要がある関数があります。私のアイデアは、タイムアウトが 0ms のタイマーを作成することでした。次のコードを試しました:

void myFunction() {
    ...
    uv_timer_t* timer = new uv_timer_t();
    uv_timer_init(uv_default_loop(), timer);
    uv_timer_start(timer, [&](uv_timer_t* timer, int status) {
        // Scheduled task
    }, 0, 0);
}

このアプローチはうまく機能しますが、問題は、動的に割り当てられたタイマーが決して解放されないことです。コールバックでタイマーを解放しようとしましたが、セグメンテーション違反が発生しました:

void myFunction() {
    ...
    uv_timer_t* timer = new uv_timer_t();
    uv_timer_init(uv_default_loop(), timer);
    uv_timer_start(timer, [&](uv_timer_t* timer, int status) {
        // Scheduled task
        delete timer;
    }, 0, 0);
}

uv_timer_stop(timer);また、実際のメモリを解放する前にandを呼び出そうとしましuv_unref((uv_handle_t*) timer);たが、セグメンテーション違反はまだ残っています。

4

2 に答える 2

1

@IntelliAdmin の回答に基づいて、自分で閉じたくない場合や、参照がなくなったときに閉じたい場合は、スマート ポインターを使用できます。

template<typename T>
using deleted_unique_ptr = std::unique_ptr<T, std::function<void( T* )>>;


deleted_unique_ptr<uv_timer_t> timer = deleted_unique_ptr<uv_timer_t>( new uv_timer_t, [&]( uv_timer_t *timerhandl ) {
    uv_close( reinterpret_cast<uv_handle_t *>( timerhandl ), OnTimerClose );
});

次に、コールバックのためにポインターを削除します。

void OnTimerClose( uv_handle_t *handle )
{
    delete handle;
}
于 2016-05-16T19:26:57.713 に答える