繁体   English   中英

在虚幻引擎中删除 NXOpen 对象时崩溃

[英]Crash when NXOpen objects are deleted in Unreal Engine

你好,stackoverflow 社区,

第一次问。

我正在开发一个原型,用于使用虚幻引擎在 VR 中对 CAD 数据进行建模。 我已经成功地使用我的 CAD 系统 Siemens NX 或者 API NXOpen 构建了我的 Unreal 项目。

总体而言,API 有效,我可以调用 NXOpen 函数并可以创建基本对象,但有些操作会导致崩溃,我猜测它与内存管理有关。 我无法理解到底发生了什么。

例如,我有代码可以创建一个工作正常的 NX 块功能。 之后我需要一个存储在块特征内的主体对象。 访问也有效,但是当“主体”超出范围时,它会崩溃。 访问 NX 功能中的各种数据时会发生类似的崩溃。 这个虚拟代码经常触发崩溃:


    // 'block' gets created here

    if (block) {
        std::vector<NXOpen::Body*> bodies = block->GetBodies();
        if (bodies.size() > 0) {
            NXOpen::Body* body = bodies.front();
        }
    } // <-- this line crashes

Exception thrown: read access violation.
**flag** was 0xFFFFFFFFFFFFFFFF. occurred

    [Inline Frame] UE4Editor-Core.dll!__TBB_machine_cmpswp1(volatile void *) Line 69    C++
>   [Inline Frame] UE4Editor-Core.dll!__TBB_TryLockByte(unsigned char &) Line 917   C++
    UE4Editor-Core.dll!__TBB_LockByte(unsigned char & flag) Line 924    C++
    [Inline Frame] UE4Editor-Core.dll!MallocMutex::scoped_lock::{ctor}(MallocMutex &) Line 66   C++
    UE4Editor-Core.dll!rml::internal::Block::freePublicObject(rml::internal::FreeObject * objectToFree) Line 1382   C++
    [Inline Frame] UE4Editor-Core.dll!rml::internal::internalPoolFree(rml::internal::MemoryPool * memPool, void *) Line 2571    C++
    UE4Editor-Core.dll!rml::internal::internalFree(void * object) Line 2595 C++
    UE4Editor-Core.dll!FMemory::Free(void * Original) Line 76   C++
    UE4Editor-GestEnUE-Win64-DebugGame.dll!operator delete(void * Ptr, unsigned __int64 Size) Line 6    C++
    [External Code] 
    UE4Editor-GestEnUE-Win64-DebugGame.dll!UNXConnection::AddPointSetsToBody(const FString & name) Line 268 C++
    UE4Editor-GestEnUE-Win64-DebugGame.dll!ANXPart::AddCylinder(FVector pos, FVector axis, float height, float diameter, bool WorldSpace) Line 103  C++
    UE4Editor-GestEnUE-Win64-DebugGame.dll!ANXPart::execAddCylinder(UObject * Context, FFrame & Stack, void * const Z_Param__Result) Line 18    C++
    UE4Editor-CoreUObject.dll!UFunction::Invoke(UObject * Obj, FFrame & Stack, void * const Z_Param__Result) Line 4643  C++
    UE4Editor-CoreUObject.dll!UObject::CallFunction(FFrame & Stack, void * const Z_Param__Result, UFunction * Function) Line 904    C++
    [Inline Frame] UE4Editor-CoreUObject.dll!FFrame::Step(UObject *) Line 319   C++
    UE4Editor-CoreUObject.dll!UObject::ProcessContextOpcode(FFrame & Stack, void * const Z_Param__Result, bool bCanFailSilently) Line 2314  C++
    [Inline Frame] UE4Editor-CoreUObject.dll!FFrame::Step(UObject *) Line 319   C++
    UE4Editor-CoreUObject.dll!UObject::execLetObj(UObject * Context, FFrame & Stack, void * const Z_Param__Result) Line 2136    C++
    [Inline Frame] UE4Editor-CoreUObject.dll!FFrame::Step(UObject *) Line 319   C++
    UE4Editor-CoreUObject.dll!ProcessLocalScriptFunction(UObject * Context, FFrame & Stack, void * const Z_Param__Result) Line 974  C++
    UE4Editor-CoreUObject.dll!ProcessScriptFunction<void (__cdecl*)(UObject *,FFrame &,void *)>(UObject * Context, UFunction * Function, FFrame & Stack, void * const Z_Param__Result, void(*)(UObject *, FFrame &, void *) ExecFtor) Line 809  C++
    UE4Editor-CoreUObject.dll!ProcessLocalFunction(UObject * Context, UFunction * Fn, FFrame & Stack, void * const Z_Param__Result) Line 1033   C++
    [Inline Frame] UE4Editor-CoreUObject.dll!FFrame::Step(UObject *) Line 319   C++
    UE4Editor-CoreUObject.dll!ProcessLocalScriptFunction(UObject * Context, FFrame & Stack, void * const Z_Param__Result) Line 974  C++
    UE4Editor-CoreUObject.dll!ProcessScriptFunction<void (__cdecl*)(UObject *,FFrame &,void *)>(UObject * Context, UFunction * Function, FFrame & Stack, void * const Z_Param__Result, void(*)(UObject *, FFrame &, void *) ExecFtor) Line 809  C++
    UE4Editor-CoreUObject.dll!ProcessLocalFunction(UObject * Context, UFunction * Fn, FFrame & Stack, void * const Z_Param__Result) Line 1033   C++
    [Inline Frame] UE4Editor-CoreUObject.dll!FFrame::Step(UObject *) Line 319   C++
    UE4Editor-CoreUObject.dll!UObject::ProcessContextOpcode(FFrame & Stack, void * const Z_Param__Result, bool bCanFailSilently) Line 2314  C++
    [Inline Frame] UE4Editor-CoreUObject.dll!FFrame::Step(UObject *) Line 319   C++
    UE4Editor-CoreUObject.dll!ProcessLocalScriptFunction(UObject * Context, FFrame & Stack, void * const Z_Param__Result) Line 974  C++
    UE4Editor-CoreUObject.dll!ProcessScriptFunction<void (__cdecl*)(UObject *,FFrame &,void *)>(UObject * Context, UFunction * Function, FFrame & Stack, void * const Z_Param__Result, void(*)(UObject *, FFrame &, void *) ExecFtor) Line 809  C++
    UE4Editor-CoreUObject.dll!ProcessLocalFunction(UObject * Context, UFunction * Fn, FFrame & Stack, void * const Z_Param__Result) Line 1033   C++
    [Inline Frame] UE4Editor-CoreUObject.dll!FFrame::Step(UObject *) Line 319   C++
    UE4Editor-CoreUObject.dll!ProcessLocalScriptFunction(UObject * Context, FFrame & Stack, void * const Z_Param__Result) Line 974  C++
    UE4Editor-CoreUObject.dll!UObject::ProcessInternal(UObject * Context, FFrame & Stack, void * const Z_Param__Result) Line 1058   C++
    UE4Editor-CoreUObject.dll!UFunction::Invoke(UObject * Obj, FFrame & Stack, void * const Z_Param__Result) Line 4643  C++
    UE4Editor-CoreUObject.dll!UObject::ProcessEvent(UFunction * Function, void * Parms) Line 1464   C++
    UE4Editor-Engine.dll!AActor::ProcessEvent(UFunction * Function, void * Parameters) Line 769 C++
    UE4Editor-GestEnUE-Win64-DebugGame.dll!ABuilderBase::commit() Line 37   C++
    UE4Editor-GestEnUE-Win64-DebugGame.dll!AGestEnLeapPawn::Tick(float DeltaTime) Line 138  C++
    UE4Editor-Engine.dll!AActor::TickActor(float DeltaSeconds, ELevelTick TickType, FActorTickFunction & ThisTickFunction) Line 970 C++
    UE4Editor-Engine.dll!FActorTickFunction::ExecuteTick(float DeltaTime, ELevelTick TickType, ENamedThreads::Type CurrentThread, const TRefCountPtr<FGraphEvent> & MyCompletionGraphEvent) Line 164    C++
    [Inline Frame] UE4Editor-Engine.dll!FTickFunctionTask::DoTask(ENamedThreads::Type) Line 285 C++
    UE4Editor-Engine.dll!TGraphTask<FTickFunctionTask>::ExecuteTask(TArray<FBaseGraphTask *,FDefaultAllocator> & NewTasks, ENamedThreads::Type CurrentThread) Line 842  C++
    [Inline Frame] UE4Editor-Core.dll!FBaseGraphTask::Execute(TArray<FBaseGraphTask *,FDefaultAllocator> & CurrentThread, ENamedThreads::Type) Line 511 C++
    UE4Editor-Core.dll!FNamedTaskThread::ProcessTasksNamedThread(int QueueIndex, bool bAllowStall) Line 686 C++
    UE4Editor-Core.dll!FNamedTaskThread::ProcessTasksUntilQuit(int QueueIndex) Line 582 C++
    [Inline Frame] UE4Editor-Core.dll!FTaskGraphImplementation::ProcessThreadUntilRequestReturn(ENamedThreads::Type) Line 1406  C++
    UE4Editor-Core.dll!FTaskGraphImplementation::WaitUntilTasksComplete(const TArray<TRefCountPtr<FGraphEvent>,TInlineAllocator<4,FDefaultAllocator> > & Tasks, ENamedThreads::Type CurrentThreadIfKnown) Line 1457 C++
    UE4Editor-Engine.dll!FTickTaskSequencer::ReleaseTickGroup(ETickingGroup WorldTickGroup, bool bBlockTillComplete) Line 557   C++
    UE4Editor-Engine.dll!FTickTaskManager::RunTickGroup(ETickingGroup Group, bool bBlockTillComplete) Line 1505 C++
    UE4Editor-Engine.dll!UWorld::RunTickGroup(ETickingGroup Group, bool bBlockTillComplete) Line 789    C++
    UE4Editor-Engine.dll!UWorld::Tick(ELevelTick TickType, float DeltaSeconds) Line 1568    C++
    UE4Editor-UnrealEd.dll!UEditorEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 1618    C++
    UE4Editor-UnrealEd.dll!UUnrealEdEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 403   C++
    UE4Editor-Win64-DebugGame.exe!FEngineLoop::Tick() Line 3967 C++
    [Inline Frame] UE4Editor-Win64-DebugGame.exe!EngineTick() Line 62   C++
    UE4Editor-Win64-DebugGame.exe!GuardedMain(const wchar_t * CmdLine, HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, int nCmdShow) Line 168   C++
    UE4Editor-Win64-DebugGame.exe!WinMain(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow) Line 261   C++

如果我正确理解调用堆栈,则会在删除对象时发生错误。 但为什么这会成为问题呢? 会不会是虚幻和NX第三方库都试图管理内存?

有没有人知道什么可能导致这些崩溃,甚至知道如何解决它? 如有必要,我很乐意提供更多信息。

问候, LaRanaRica

我发现在使用 NXOpen 时,使用调试运行库经常会导致内存错误。 您可以使用链接器设置 /MD(而不是 /MDd)更改此设置。

我知道这已经晚了,但我有一个比在发布模式而不是调试模式下构建更好的解决方案,因为我以前多次遇到过这个问题,并使用相同的简单解决方案解决了它。

我不知道为什么NX Open C++ 会发生这种情况,但只有在使用std::vector (某些 NX Open C++ API 返回)和调试模式时才会发生这种情况。 您可以通过将此行添加到 C++ 源文件的顶部,在所有#include之前来修复它:

#define _ITERATOR_DEBUG_LEVEL 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM