UE4のデストラクタについて
よくある問題
ゲームの実装にアクター(Actorクラス)や、
アクターコンポーネント(ActorComponentクラス)を使用すると思います。
これらを破棄するにはDestroyを使用すると思います。
// e.g.
AACtor* Alice;
:
Alice->Destroy(); // ここでデストラクタは呼ばれ…?
実はこの場合、Destroy時にすぐデストラクタは呼ばれません。
詳しくは後述しますが、
デストラクタが呼ばれるのはDestroyしたタイミングではありません。
そのため処理順によってはバグに繋がります
デストラクタはいつ呼ばれるの?
アクターに対してDestroyをかけた場合は、
IsPendingKill のフラグがたち、
GCなどによってフラグがたっているもの全てが破棄されます。
このときに呼ばれます。
それまでは内部的には実体が残っているのでデストラクタは呼ばれません。
アクターのライフサイクル(公式ドキュメント)
終了処理はどう書くの?
ではデストラクタではなく、どこにゲーム中の終了処理を書くかについてです。
EndPlay をオーバーライドすることで終了処理を書けます。
class MY_API AAlice : public AActor
{
:
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
これであればDestroyされたり、
Levelがアンロードされたときに終了処理がすぐ呼ばれます。
まとめ
デストラクタに終了処理を無闇に実装するのは処理順の関係上危険です
特殊な処理やデバッグ処理を書かない限り、
基本的にデストラクタは書く必要がないでしょう。
Author And Source
この問題について(UE4のデストラクタについて), 我々は、より多くの情報をここで見つけました https://qiita.com/pino_tabetai/items/08d37db6415b7b76b767著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .