C++ cli C++;Ref类不是System::IDisposable的成员;无法实现IDisposable

C++ cli C++;Ref类不是System::IDisposable的成员;无法实现IDisposable,c++-cli,implementation,idisposable,C++ Cli,Implementation,Idisposable,我想为我自己的对象类创建一个名为“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(我现在知

我想为我自己的对象类创建一个名为“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;
    }
}; 

使用析构函数。在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;
    }
}; 
ref-class全局:系统::IDisposable
{  
公众:
静态cliext::vector person\u data=gcnew cliext::vector;
void~Globals()
{
删除个人资料;
}
}; 

使用终结器,如所示,您不必显式地从IDisposable派生。按照,使用以下模式:

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();
    }
};
ref类全局变量
{
公众:
静态cliext::vector person\u data=gcnew cliext::vector;
!Globals()//终结器
{
删除个人资料;
{
受保护的:
~Globals()//析构函数调用终结器
{
此->!Globals();
}
};
在C++/CLI中,C++/CLI Dispose模式具有以下规则(意译):

  • 如果类具有终结器或 编译器生成的析构函数
    Dispose(bool)
    将调用 基于的终结器或析构函数
    bool
  • 如果它只有一个d'tor(~type),那么编译器将调用 Dispose(true),因此称为d'tor
  • 如果它只有一个终结器(!type) 然后编译器调用 Dispose(false),使终结器 叫
同样对于第二条规则:编译器将为您实现
IDisposable
接口(通过生成
Dispose()
),然后使用
SuppressFinalize
确保没有调用终结器

我对您的代码执行了此操作,唯一能让它编译的方法是将person_数据作为实例成员。当它是静态的时,我得到的错误是
错误C2039:“{dtor}”:不是“System::IDisposable”的成员,这没有多大意义

另外,由于person\u数据向量是一个托管对象,您甚至需要删除它吗?也许需要,但我还没有使用cliext来说明

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

当您将成员变量声明为 静态和何时启动应用程序 启动时,编译器将创建 那个成员,这个成员是 由编译器维护,而 程序正在运行。如果您声明 类的实例,如上面所示 车辆变量,静态构件为 不是对象的一部分:编译器 创建并维护静态 成员,无论您是否使用它, 是否声明类变量 或者不是


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

接下来,您需要决定person_数据是句柄(必须设置为使用gcnew创建的实例)还是成员对象语义(与堆栈语义类似,构造函数由父对象的构造函数自动调用,析构函数在父对象的生存期结束时自动调用,您可以使用“.”而不是“->”来访问成员)


另外,是否确实要在“全局”的所有实例之间共享一份person_数据副本,但该副本将被第一个实例销毁,从而使任何其他实例保留无效引用(对已处置对象的引用)?看起来您试图在这里使用单例反模式,对吗?

编译器然后说析构函数不能有返回类型。但是,删除“void”会使编译器无法将函数识别为IDisposable的实现(因为它的形式可能是void func(void))感谢您的帮助,但我仍然在以下位置收到错误:static cliext::vector person_data=gcnew cliext::vector;编译器声明析构函数不是IDisposable:1>error C2039:'{dtor}的成员“:不是'System::IDisposable'1>c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll的成员:请参阅'System::IDisposable'的声明即使在确保Person类确实可以IDisposable之后,它仍然拒绝编译。我能让它编译的唯一方法是从Person_数据中删除'static'关键字。只要有一个cliext::vector类型的静态成员你会犯这个错误--我尝试删除person_数据并用cliext::vector int_data=gcnew cliext::vector替换它,但仍然会出现相同的错误!这超出了我的能力。你不能删除那些不是handleThanks的内容。谢谢你的回复,我想这确实会起作用。不知道为什么会出现析构函数错误但是一直在出现。我似乎找不到有关在析构函数或终结器中释放静态成员的任何信息。可能有人知道答案并将共享。静态成员由.cctor初始化,而不是在应用程序启动时初始化
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();
    }
};