考慮下面的類:正確的對象處理在C++/CLI
public ref class Workspace
{
protected:
Form^ WorkspaceUI;
SplitContainer^ WorkspaceSplitter;
AvalonEditTextEditor^ TextEditor;
ScriptOffsetViewer^ OffsetViewer;
SimpleTextViewer^ PreprocessedTextViewer;
ListView^ MessageList;
ListView^ FindList;
ListView^ BookmarkList;
ListView^ VariableIndexList;
TextBox^ VariableIndexEditBox;
Label^ SpoilerText;
ToolStrip^ WorkspaceMainToolBar;
ToolStripButton^ ToolBarNewScript;
ToolStripButton^ ToolBarOpenScript;
ToolStripButton^ ToolBarPreviousScript;
ToolStripButton^ ToolBarNextScript;
ToolStripSplitButton^ ToolBarSaveScript;
ToolStripDropDown^ ToolBarSaveScriptDropDown;
ToolStripButton^ ToolBarSaveScriptNoCompile;
ToolStripButton^ ToolBarSaveScriptAndPlugin;
ToolStripButton^ ToolBarRecompileScripts;
ToolStripButton^ ToolBarCompileDependencies;
ToolStripButton^ ToolBarDeleteScript;
ToolStripButton^ ToolBarNavigationBack;
ToolStripButton^ ToolBarNavigationForward;
ToolStripButton^ ToolBarSaveAll;
ToolStripButton^ ToolBarOptions;
ArbitraryCustomClass^ CustomClassInstance;
public:
Workspace()
{
WorkspaceUI = gcnew Form();
WorkspaceSplitter = gcnew SplitContainer();
// ...
Form->Controls->Add(WorkspaceSplitter);
// ...
WorkspaceUI->Show();
}
~Workspace
{
// dispose stuff here
}
};
什麼是最有效和最優雅的方式來處理上述類的實例,使所有的內存是由GC回收在下一次收集?我是否需要撥打刪除明確在每個成員和/或重置他們到nullptr?
在這種情況下,如何將對象傳遞給需要其句柄的函數?如: Label SomeText; Form.Controls-> Add(SomeText); //引發編譯器錯誤 – shadeMe
此外,繼續創建和銷燬上述類只會導致System.OutOfMemoryException - GC似乎不會回收對象的內存。這使我相信,它可能有強烈的參考甚至過去的破壞。在我的代碼中,所有類的實例都被分配並直接添加到列表中。銷燬時,實例將從相同的位置移除。這是每個實例在根中獲取的唯一參考。然而,這個班的不同成員有多個內部參考。 – shadeMe
@shadeMe:您需要在Workspace對象本身調用Dispose來觸發處理所有擁有的對象。 –