UnrealEngine4 - 关于UObject被自动GC垃圾回收的巨坑
1 出現(xiàn)的問題
在一個插件中新建了一個靜態(tài)的繼承于UObject的對象
static UMyObject* m_Object = nullptr;
1
然后在插件的藍圖函數(shù)中對其進行了初始化:
m_Object = NewObject<UMyObject>();
1
過了一段時間之后發(fā)現(xiàn)這個對象被析構(gòu),導(dǎo)致野指針,造成程序崩潰!
這尼瑪可是靜態(tài)對象指針!
2 UE4對UObject的自動析構(gòu)機制
UE4對UObject對象不像C++,UE4會在UObject對象沒有任何引用時候自動回收該對象。(太智能了,智能的讓人頭皮發(fā)麻)
而C++對象如果是動態(tài)創(chuàng)建的會一直存在于程序的聲明周期中,如果不主動析構(gòu),就會造成內(nèi)存泄漏。
從明面上看UE4這種防止內(nèi)存泄漏的機制很完美,但是對于剛剛接觸UE4的新手來說,滿以為UE4采用的C++,但是這個機制確實如此的不同,容易造成野指針的問題。
3 保持UObject對象不被自動析構(gòu)
如果在普通C++類中有一個UObject* A變量,那么在創(chuàng)建完該變量之后,最好使用AddToRoot,這樣就不會被UE4自動GC,然后在析構(gòu)函數(shù)中,使用RemoveFromRoot即可自動讓UE4GC,防止內(nèi)存泄漏。
UMyObject* m_Object = NewObject<UMyObject>();
m_Object->AddToRoot();
1
2
然后在C++類析構(gòu)函數(shù)中添加:
m_Object->RemoveFromRoot();
1
如果是在繼承UObject類中有一個UObject* A變量,那么即可使用UPROPERTY宏標(biāo)記一下這個變量,則此變量就不會被UE4自動GC,在該類被銷毀的時候,變量A會被設(shè)置為null,在之后會被UE4自動GC。
————————————————
版權(quán)聲明:本文為CSDN博主「HW140701」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/HW140701/article/details/110149812
總結(jié)
以上是生活随笔為你收集整理的UnrealEngine4 - 关于UObject被自动GC垃圾回收的巨坑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构实验之查找一:二叉排序树
- 下一篇: icpc青岛栈