3

我想为我自己的对象类创建一个名为“Person”的全局向量。但是,编译器说

    error C2039: '{dtor}' : is not a member of 'System::IDisposable'
1>        c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : see declaration of 'System::IDisposable'

所以我查找了如何实现 IDisposable (我现在知道它主要用于非托管资源),但似乎仍然无法通过以下方式实现它:

ref class Globals : System::IDisposable
{  
public: 
  static cliext::vector<Person^> person_data = gcnew cliext::vector<Person^>;
    void Dispose()
    {
         delete person_data;
    }
}; 

我得到的两个错误是:

error C2605: 'Dispose' : this method is reserved within a managed class
1>        did you intend to define a destructor?
error C3766: 'Globals' must provide an implementation for the interface method 'void System::IDisposable::Dispose(void)'
1>        c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : see declaration of 'System::IDisposable::Dispose'
4

5 回答 5

3

您不必显式地从 IDisposable 派生。按照MSDN doco,使用以下模式:

ref class Globals
{
public:
    static cliext::vector<Person^> person_data = gcnew cliext::vector<Person^>;
    !Globals() // finalizer
    {
        delete person_data;
    {
protected:
    ~Globals() // destructor calls finalizer
    {
        this->!Globals();
    }
};
于 2010-02-08T04:31:17.377 回答
1

使用析构函数。在 C++/CLI 中,~ClassName() 是 Dispose(),!ClassName() 等价于 C# 的 ~ClassName()。在你的情况下:

ref class Globals : System::IDisposable
{  
public: 
    static cliext::vector<Person^> person_data = gcnew cliext::vector<Person^>;
    void ~Globals()
    {
        delete person_data;
    }
}; 
于 2010-02-07T17:51:18.687 回答
0

使用终结器,如http://www.codeproject.com/KB/mcpp/cppclidtors.aspx所示

于 2010-02-07T22:45:33.763 回答
0

您不需要直接或通过析构函数自己实现 Dispose()。隐式生成的析构函数已经销毁了所有成员对象。IDisposable 接口会自动添加,不要明确提及。

接下来,你需要确定 person_data 是句柄(必须设置为使用 gcnew 创建的实例)还是成员对象语义(如堆栈语义,构造函数由父对象的构造函数自动调用,析构函数在父对象的生命周期结束时自动调用,并且您使用“.”而不是“->”来访问成员)。

此外,您确定要在“全局”的所有实例之间共享一个 person_data 副本,但被第一个实例销毁,从而使任何其他实例持有无效引用(对已处理对象的引用)?看起来您在这里尝试使用单例反模式,对吗?

于 2010-02-23T16:18:06.643 回答
-1

来自C++/CLI in Action C++/CLI Dispose 模式具有以下规则(释义):

  • 如果一个类有一个终结器或析构函数,编译器生成 Dispose(bool)的将根据bool值调用终结器或析构函数。
  • 如果它只有一个 d'tor (~type),那么编译器会调用 Dispose(true),所以会调用 d'tor。
  • 如果它只有一个终结器 (!type) 则编译器调用 Dispose(false) 所以终结器被调用

同样适用于第二条规则:编译器将为IDisposable您实现接口(通过生成Dispose())。然后它SuppressFinalize用于确保不调用终结器。

我对您的代码执行了此操作,而编译它的唯一方法是使 person_data 成为实例成员。我在静态时遇到的错误error C2039: '{dtor}' : is not a member of 'System::IDisposable'没有多大意义。

另外,你甚至需要deleteperson_data 向量,因为它是一个托管对象?也许你这样做,但我没有使用足够的 cliext 来说明。

编辑也许这篇文章的第一段有答案(强调我的):

当您将成员变量声明为静态并且应用程序启动时,编译器会创建该成员的副本。该成员将在程序运行时由编译器维护。如果你声明一个类的实例,就像上面的车辆变量,静态成员 不是对象的一部分:编译器创建并维护静态成员,无论你是否使用它,无论你是否声明一个类变量。

于 2010-02-08T18:07:50.303 回答