系统:: IDisposable困境

时间:2010-03-13 11:54:06

标签: clr c++-cli dispose

public ref class ScriptEditor : public Form
{
public:
    typedef map<UInt32, ScriptEditor^>                  AlMap;
    static AlMap                                        AllocationMap;

    Form^                                               EditorForm;     
    RichTextBox^                                        EditorBox;
    StatusBar^                                          EditorStatusBar;
    StatusBarPanel^                                     StatusBarLineNo;

    void                                                Destroy() { EditorForm->Close(); }
                                                        ScriptEditor(unsigned int PosX, unsigned int PosY);
};

以上代码抛出错误C2039:'{dtor}':不是'System :: IDisposable'的成员。在查看解释CLR如何管理内存的文章之后,我完全迷失了。任何关于摆脱它的建议将不胜感激。我在C +++ / CLI中的第一个涉猎不太好。

1 个答案:

答案 0 :(得分:1)

您没有收到非常好的错误消息。但问题是STL地图&lt;&gt;模板类仅适用于非托管类型。它要求元素类型具有析构函数,托管类型没有析构函数。在C ++ / CLI语言中,使用IDisposable接口模拟析构函数,这是您看到的令人困惑的错误消息的来源。

如果您真的想使用STL,可以使用VS2008中提供的STL/CLR implementation。然而,它被广泛忽略,因为它基本上将STL(昂贵的值语义)的缺点与托管代码的缺点相结合(在引用类型上没有默认值语义)。 This web page将它与本机.NET集合类进行比较,结果显而易见。

此处使用的相应集合类是System::Collections::Generic::Dictionary<>