2017-06-13 187 views
1

我有以下功能:在IsValid(Object)返回true後,爲什麼不能安全地使用Object?

void AddActor(AActor* Actor) 
{ 
    if (!IsValid(Actor)) { return; }  

    if (Actor->IsA(ACertainActor::StaticClass())) 
    { 
     //... 
    } 
} 

它得到通過一些有效的和一些無效Actor -pointers(Actors待審覈破壞或者已毀)。

並根據代碼文檔IsValid()返回true如果對象是可用的:

/** 
* Test validity of object 
* 
* @param Test   The object to test 
* @return Return true if the object is usable: non-null and not pending kill 
*/ 

但在if (Actor->IsA(ACertainActor::StaticClass()))崩潰引發訪問衝突:

Exception thrown at 0x00007FF868B56895 (UE4Editor-CoreUObject.dll) in UE4Editor.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF. 

我預計IsValid(Object)檢查是否Objectnullptr,引擎知道Object,如果它確實檢查它是否等待銷燬。 因此在IsValid(Object)返回true後,Object應該可用。

這不是它的工作原理嗎?

是否有任何其他方式來檢查指針是否指向可以使用的有效對象?

+0

在調用'IsValid'之前,文檔沒有清楚地解釋需求。但可以推測,你的代碼並不符合他們的要求。我推測指針必須是nullptr,指向一個有效的'AActor'或指向一個無效的'AActor'(等待中止)。 –

回答

3

那麼從您的異常:

異常在UE4Editor.exe在0x00007FF868B56895(UE4Editor-CoreUObject.dll)拋出:0000005:訪問衝突讀取位置0xFFFFFFFFFFFFFFFF。

明確指出這個指針不是nullptr,它的值是0xFFFFFFFFFFFFFFFF。所以IsValid作品寫的文檔:

返回true,如果對象是可用的:非空的,也不是掛起殺

你應該初始化指針nullptr

相關問題