Dear Friends at Epic,
I am getting a 4.2 Slate crash that was I not getting in 4.1.1 using the same code.
It is a “Scalar Copy Destructor” crash inside ~Widget()
Any ideas what I should do differently?
my tree item was a class originally and I made it a struct in my first solution attempt.
The Widget runs perfectly in-game, it is only when I do Console->Restart Level that the crash happens
#Error
[2014.06.15-21.26.40:422][271]LogLoad: LoadMap: /Game/Maps/JoyShapes?Name=Player
[2014.06.15-21.26.40:436][271]LogParticles: Destroying 0 GPU particle simulations for FXSystem 0x0000000013195F80
[2014.06.15-21.26.41:812][271]LogWindows: === Critical error: ===
Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0xffffffff
[2014.06.15-21.26.41:812][271]LogWindows: Fatal error!
SWidget::~SWidget() Address = 0xe1c6b4d7 (filename not found) [in E:\VictoryUE4\UnrealEngine-4.2\Engine\Binaries\Win64\UE4Editor-SlateCore.dll]
SJoyFileTree::`scalar deleting destructor'() Address = 0xd673b014 (filename not found) [in C:\Users\Rama\Documents\Unreal Projects\JoyShapes\Binaries\Win64\UE4Editor-JoyShapes.dll]
AJoyHUDSlate::~AJoyHUDSlate() Address = 0xd6727be2 (filename not found) [in C:\Users\Rama\Documents\Unreal Projects\JoyShapes\Binaries\Win64\UE4Editor-JoyShapes.dll]
AJoyHUD::`scalar deleting destructor'() Address = 0xd673a534 (filename not found) [in C:\Users\Rama\Documents\Unreal Projects\JoyShapes\Binaries\Win64\UE4Editor-JoyShapes.dll]
IncrementalPurgeGarbage() 0xe1efd12f + 0 bytes [File=e:\victoryue4\unrealengine-4.2\engine\source\runtime\coreuobject\private\uobject\garbagecollection.cpp:959] [in E:\VictoryUE4\UnrealEngine-4.2\Engine\Binaries\Win64\UE4Editor-CoreUObject.dll]
CollectGarbage() 0xe1ee3175 + 0 bytes [File=e:\victoryue4\unrealengine-4.2\engine\source\runtime\coreuobject\private\uobject\garbagecollection.cpp:1158] [in E:\VictoryUE4\UnrealEngine-4.2\Engine\Binaries\Win64\UE4Editor-CoreUObject.dll]
UEngine::LoadMap() 0xdf2a1abc + 0 bytes [File=e:\victoryue4\unrealengine-4.2\engine\source\runtime\engine\private\unrealengine.cpp:8137] [in E:\VictoryUE4\UnrealEngine-4.2\Engine\Binaries\Win64\UE4Editor-Engine.dll]
UEngine::Browse() 0xdf25c799 + 41 bytes [File=e:\victoryue4\unrealengine-4.2\engine\source\runtime\engine\private\unrealengine.cpp:7584] [in E:\VictoryUE4\UnrealEngine-4.2\Engine\Binaries\Win64\UE4Editor-Engine.dll]
UEngine::TickWorldTravel() 0xdf2c4bcd + 62 bytes [File=e:\victoryue4\unrealengine-4.2\engine\source\runtime\engine\private\unrealengine.cpp:7750] [in E:\VictoryUE4\UnrealEngine-4.2\Engine\Binaries\Win64\UE4Editor-Engine.dll]
UGameEngine::Tick() 0xdedb58ce + 0 bytes [File=e:\victoryue4\unrealengine-4.2\engine\source\runtime\engine\private\gameengine.cpp:879] [in E:\VictoryUE4\UnrealEngine-4.2\Engine\Binaries\Win64\UE4Editor-Engine.dll]
FEngineLoop::Tick() 0x3fb87b03 + 0 bytes [File=e:\victoryue4\unrealengine-4.2\engine\source\runtime\launch\private\launchengineloop.cpp:2091] [in E:\VictoryUE4\UnrealEngine-4.2\Engine\Binaries\Win64\UE4Editor.exe]
GuardedMain() 0x3fb7d1ec + 0 bytes [File=e:\victoryue4\unrealengine-4.2\engine\source\runtime\launch\private\launch.cpp:132] [in E:\VictoryUE4\UnrealEngine-4.2\Engine\Binaries\Win64\UE4Editor.exe]
GuardedMainWrapper() 0x3fb7d25a + 5 bytes [File=e:\victoryue4\unrealengine-4.2\engine\source\runtime\launch\private\windows\launchwindows.cpp:125] [in E:\VictoryUE4\UnrealEngine-4.2\Engine\Binaries\Win64\UE4Editor.exe]
WinMain() 0x3fb89119 + 17 bytes [File=e:\victoryue4\unrealengine-4.2\engine\source\runtime\launch\private\windows\launchwindows.cpp:207] [in E:\VictoryUE4\UnrealEngine-4.2\Engine\Binaries\Win64\UE4Editor.exe]
__tmainCRTStartup() 0x3fb89fa9 + 21 bytes [File=f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c:618] [in E:\VictoryUE4\UnrealEngine-4.2\Engine\Binaries\Win64\UE4Editor.exe]
Address = 0x76be652d (filename not found) [in C:\Windows\system32\kernel32.dll]
Address = 0x76e1c521 (filename not found) [in C:\Windows\SYSTEM32\ntdll.dll]
Address = 0x76e1c521 (filename not found) [in C:\Windows\SYSTEM32\ntdll.dll]
[2014.06.15-21.26.41:813][271]LogExit: Executing StaticShutdownAfterError
[2014.06.15-21.26.41:818][271]LogWindows: FPlatformMisc::RequestExit(1)
[2014.06.15-21.26.41:819][271]Log file closed, 06/15/14 17:26:41
#.h of JoyFileTree
#pragma once
//Core
#include "VictoryCore.h"
//File Tree Item
#include "JoyFileTreeItem.h"
//Listing
#include "SJoyFilesListing.h"
//~~~ Forward Declarations ~~~
class AJoyHUDSlate;
typedef STreeView< FJoyFileTreeItemPtr > SJoyFileTreeView;
/**
* File Tree View
*/
class SJoyFileTree : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS( SJoyFileTree )
{}
SLATE_END_ARGS()
//~~~~~~~~
// Data Access
//~~~~~~~~
public:
FORCEINLINE int32 HasDirectory(const FString& DirToCheck) const
{
if(AllDirectories.Num() <= 0)
{
return -1;
}
for(int32 v= 0; v < AllDirectories.Num(); v++ )
{
if(AllDirectories[v].IsValid())
{
if(AllDirectories[v]->GetDirectoryPath() == DirToCheck)
{
return v;
}
}
}
return -1;
}
FORCEINLINE FJoyFileTreeItemPtr GetOrCreateBaseDir(const FString& DirToCheck)
{
const int32 FoundBaseIndex = HasDirectory(DirToCheck);
if(HasDirectory(DirToCheck) >= 0)
{
//Use Existing Base
return AllDirectories[FoundBaseIndex];
}
else
{
//Add new!
AllDirectories.Add( MakeShareable(new FJoyFileTreeItem(NULL, DirToCheck, DirToCheck.Replace(TEXT("/"),TEXT("")))) );
return AllDirectories.Last();
}
}
//~~~~~~~~
// DDEdEngine
//~~~~~~~~
public:
//owns this
TWeakObjectPtr<class AJoyHUDSlate> JoyHUDSlate;
/** Refresh the Tree */
//bool DoRefresh;
//~~~~~~~~~~
// Rebuild Tree
//~~~~~~~~~~
public:
void RebuildFileTree();
//~~~~~~~~~~~~~~
// Refresh Tile Listing
//~~~~~~~~~~ ~~~~
public:
FString CurrentSelectedTileDir;
FORCEINLINE void RefreshJoyFileListing()
{
if(JoyFilesListing.IsValid())
{
//Get full actual Directory Path
const FString& FullPath = UVictoryCore::LevelsDir() + CurrentSelectedTileDir;
//Get Files Listing
TArray<FString> Files;
UVictoryCore::GetFiles(FullPath,Files,true,UVictoryCore::GetLevelEXT());
JoyFilesListing->RefreshJoyFileListing(Files);
}
}
//~~~~~~~~~~~~~~
// Buttons Pressed
//~~~~~~~~~~~~~~
public:
FORCEINLINE FReply RefreshButtonPressed()
{
RebuildFileTree();
RefreshJoyFileListing();
return FReply::Handled();
}
FReply ClearButtonPressed();
//~~~~~~~~~~~~~~~~
// Input
//~~~~~~~~~~~~~~~~
public:
//~~~ Key Down ~~~
virtual FReply OnKeyDown( const FGeometry& MyGeometry, const FKeyboardEvent& InKeyboardEvent ) OVERRIDE;
//~~~
public:
/** Widget constructor */
void Construct( const FArguments& Args, TWeakObjectPtr<class AJoyHUDSlate> IN_JoyHUDSlate );
/** Destructor */
~SJoyFileTree();
/** @return Returns the currently selected category item */
FJoyFileTreeItemPtr GetSelectedDirectory() const;
/** Selects the specified category */
void SelectDirectory( const FJoyFileTreeItemPtr& CategoryToSelect );
/** @return Returns true if the specified item is currently expanded in the tree */
bool IsItemExpanded( const FJoyFileTreeItemPtr Item ) const;
//~~~~~~~~~~~~~~~~~
// Core Components
//~~~~~~~~~~~~~~~~~
public:
TSharedPtr< SCanvas > JoyCanvas;
/** The tree view widget*/
TSharedPtr< SJoyFileTreeView > JoyFileTreeView;
/** The splitter between the path & collection view */
TSharedPtr<SSplitter> HorizontalSplitterPtr;
//Tile Listing
TSharedPtr<SJoyFilesListing> JoyFilesListing;
//Buttons
TSharedPtr<SButton> RefreshButton;
TSharedPtr<STextBlock> RefreshButtonText;
TSharedPtr<SButton> LoadTileButton;
TSharedPtr<SButton> ClearTileButton;
//~~~~~~~~~
// Styles
//~~~~~~~~~
public:
FSplitterStyle FileTreeSplitterStyle;
FSlateBrush FileTreePanelBrush;
FSlateBrush TilesPanelBrush;
//~~~~~~~~~~~
// Glowing Text
//~~~~~~~~~~~
public:
bool RainbowGlowColorGoingToRed;
FLinearColor RainbowGlowingColor;
void SetRainbowGlowColor();
//~~~~~~~~~~~~~
// Button Styles
//~~~~~~~~~~~~~
public:
FButtonStyle LoadTileButtonStyle;
private:
/** Called to generate a widget for the specified tree item */
TSharedRef<ITableRow> DDFileTree_OnGenerateRow( FJoyFileTreeItemPtr Item, const TSharedRef<STableViewBase>& OwnerTable );
/** Given a tree item, fills an array of child items */
void DDFileTree_OnGetChildren( FJoyFileTreeItemPtr Item, TArray< FJoyFileTreeItemPtr >& OutChildren );
/** Called when the user clicks on an item, or when selection changes by some other means */
void DDFileTree_OnSelectionChanged( FJoyFileTreeItemPtr Item, ESelectInfo::Type SelectInfo );
/** SWidget overrides */
virtual void Tick( const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime ) OVERRIDE;
//~~~~~~~~~~
// Actual Data
//~~~~~~~~~~
private:
/** Root list of categories */
TArray< FJoyFileTreeItemPtr > AllDirectories;
};
#.cpp
//I do have destructor
SJoyFileTree::~SJoyFileTree()
{
AllDirectories.Empty();
}
#Tree Item
#pragma once
typedef TSharedPtr< struct FJoyFileTreeItem > FJoyFileTreeItemPtr;
/**
* The Data for a single node in the Directory Tree
*/
struct FJoyFileTreeItem : public TSharedFromThis<FJoyFileTreeItem>
{
/** @return Returns the parent or NULL if this is a root */
const FJoyFileTreeItemPtr GetParentCategory() const
{
return ParentDir.Pin();
}
/** @return the path on hard disk, read-only */
const FString& GetDirectoryPath() const
{
return DirectoryPath;
}
/** @return name to display in file tree view! read-only */
const FString& GetDisplayName() const
{
return DisplayName;
}
/** @return Returns all subdirectories, read-only */
const TArray< FJoyFileTreeItemPtr >& GetSubDirectories() const
{
return SubDirectories;
}
/** @return Returns all subdirectories */
TArray< FJoyFileTreeItemPtr >& AccessSubDirectories()
{
return SubDirectories;
}
/** Add a subdirectory to this node in the tree! Returns node index!*/
FJoyFileTreeItemPtr AddSubDirectory(const FJoyFileTreeItemPtr NewSubDir)
{
//Exists already?
const int32 FoundItemIndex = HasSubDirectory(NewSubDir);
if(FoundItemIndex >= 0)
{
return SubDirectories[FoundItemIndex];
}
SubDirectories.AddUnique(NewSubDir);
return SubDirectories.Last();
}
int32 HasSubDirectory(const FJoyFileTreeItemPtr NewSubDir) const
{
if(SubDirectories.Num() <= 0)
{
return -1;
}
for(int32 v= 0; v < SubDirectories.Num(); v++ )
{
if(SubDirectories[v].IsValid())
{
if(SubDirectories[v]->DirectoryPath == NewSubDir->DirectoryPath)
{
return v;
}
}
}
return -1;
}
/** Constructor for FJoyFileTreeItem */
FJoyFileTreeItem(const FJoyFileTreeItemPtr IN_ParentDir, const FString& IN_DirectoryPath, const FString& IN_DisplayName)
: ParentDir( IN_ParentDir)
, DirectoryPath( IN_DirectoryPath)
, DisplayName( IN_DisplayName)
{
}
/** Parent item or NULL if this is a root */
TWeakPtr< FJoyFileTreeItem > ParentDir;
/** Full path of this directory in the tree */
FString DirectoryPath;
/** Display name of the category */
FString DisplayName;
/** Child categories */
TArray< FJoyFileTreeItemPtr > SubDirectories;
};