为什么在 IsValid(Object) 返回 true 后 Object 不能安全使用?
Why isn't Object safe to use after IsValid(Object) returned true?
我有以下功能:
void AddActor(AActor* Actor)
{
if (!IsValid(Actor)) { return; }
if (Actor->IsA(ACertainActor::StaticClass()))
{
//...
}
}
它被传递了一些有效的和一些无效的 Actor
-指针(Actors
正在等待销毁或已经销毁)。
并且根据代码文档 IsValid()
returns 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)
检查 Object
是否为 nullptr
,引擎知道 Object
,如果它确实检查它是否正在等待销毁。
所以在 IsValid(Object)
返回 true 后, Object
应该可以使用。
不是这样吗?
是否有任何其他方法来检查指针是否指向可以使用的有效对象?
嗯,从你的例外:
Exception thrown at 0x00007FF868B56895 (UE4Editor-CoreUObject.dll) in UE4Editor.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
in 明确指出这个指针不是 nullptr,它的值是 0xFFFFFFFFFFFFFFFF
。所以 IsValid
像文档中写的那样工作:
Return true if the object is usable: non-null and not pending kill
您应该将指针初始化为 nullptr
。
我有以下功能:
void AddActor(AActor* Actor)
{
if (!IsValid(Actor)) { return; }
if (Actor->IsA(ACertainActor::StaticClass()))
{
//...
}
}
它被传递了一些有效的和一些无效的 Actor
-指针(Actors
正在等待销毁或已经销毁)。
并且根据代码文档 IsValid()
returns 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)
检查 Object
是否为 nullptr
,引擎知道 Object
,如果它确实检查它是否正在等待销毁。
所以在 IsValid(Object)
返回 true 后, Object
应该可以使用。
不是这样吗?
是否有任何其他方法来检查指针是否指向可以使用的有效对象?
嗯,从你的例外:
Exception thrown at 0x00007FF868B56895 (UE4Editor-CoreUObject.dll) in UE4Editor.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
in 明确指出这个指针不是 nullptr,它的值是 0xFFFFFFFFFFFFFFFF
。所以 IsValid
像文档中写的那样工作:
Return true if the object is usable: non-null and not pending kill
您应该将指针初始化为 nullptr
。