[4.2 Slate] "Scalar Copy Destructor" Crash, did not happen in 4.1.1

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;
};

Hey

We were not able to investigate this on the engine version you reported, but there have been many version changes to UE4 since this question was first posted. With a new version of the Engine comes new fixes and it is possible that this issue has changed or may no longer occur. Due to timetable of when this issue was first posted, we are marking this post as resolved for tracking purposes.

If you are still experiencing the issue you reported in the current engine version, then please respond to this message with additional information and we will investigate as soon as possible. If you are experiencing a similar, but different issue at this time, please submit a new report for it.

Thank you.

Thanks !

Rama