簡體   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