考虑下面的类:正确的对象处理在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来触发处理所有拥有的对象。 –