UE4のデストラクタについて


よくある問題

ゲームの実装にアクター(Actorクラス)や、
アクターコンポーネント(ActorComponentクラス)を使用すると思います。
これらを破棄するにはDestroyを使用すると思います。

Actor
// e.g.
AACtor* Alice;
:
Alice->Destroy(); // ここでデストラクタは呼ばれ…?

実はこの場合、Destroy時にすぐデストラクタは呼ばれません。

詳しくは後述しますが、
デストラクタが呼ばれるのはDestroyしたタイミングではありません。
そのため処理順によってはバグに繋がります

デストラクタはいつ呼ばれるの?

アクターに対してDestroyをかけた場合は、
IsPendingKill のフラグがたち、
GCなどによってフラグがたっているもの全てが破棄されます。
このときに呼ばれます。

それまでは内部的には実体が残っているのでデストラクタは呼ばれません。
アクターのライフサイクル(公式ドキュメント)

終了処理はどう書くの?

ではデストラクタではなく、どこにゲーム中の終了処理を書くかについてです。
EndPlay をオーバーライドすることで終了処理を書けます。

Actor
class MY_API AAlice : public AActor
{
:
    virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;

これであればDestroyされたり、
Levelがアンロードされたときに終了処理がすぐ呼ばれます。

まとめ

デストラクタに終了処理を無闇に実装するのは処理順の関係上危険です
特殊な処理やデバッグ処理を書かない限り、
基本的にデストラクタは書く必要がないでしょう。