【问题标题】:unmanaged var as member of managed class c++非托管 var 作为托管类 c++ 的成员
【发布时间】:2012-07-20 06:08:59
【问题描述】:

我是 .net c++ 的新手,并试图创建如下所示的类:

public ref class Klient
{
public:
    Klient(){}
    // zmienne
    static DWORD klienty[41][2];
    static int i = 1;
    static DWORD* pid;
    static HANDLE* handle;

    //funkcje
};

但 MSV 说:

error C4368: cannot define 'klienty' as a member of managed 'Klient': mixed types are not supported

这段代码有什么问题?

【问题讨论】:

  • 但是如何在不改变编程语言的情况下解决问题

标签: class c++-cli declaration mixed-mode


【解决方案1】:

您可以将 .NET 基本数据类型作为托管类的成员(静态 int i),或指向任何非托管对象的指针(DWORD* pid、HANDLE* 句柄),但您不能直接拥有非托管对象,并且整数数组为此目的计为非托管对象。

由于这里唯一给您带来问题的是非托管阵列,您可以将其切换为托管阵列。

public ref class Klient
{
public:
    Klient(){}
    // zmienne
    static array<DWORD,2>^ klienty = gcnew array<DWORD,2>(41,2);
    static int i = 1;
    static DWORD* pid;
    static HANDLE* handle;

    //funkcje
};

或者,您可以声明一个非托管类,将您需要的任何内容放入其中,并从托管类中获得指向它的指针。 (如果您在非静态上下文中执行此操作,请不要忘记从终结器中删除非托管内存。)

public class HolderOfUnmanagedStuff
{
public:
    DWORD klienty[41][2];
    int i;
    DWORD* pid;
    HANDLE* handle;

    HolderOfUnmanagedStuff()
    {
        i = 1;
    }
};

public ref class Klient
{
public:
    Klient(){}
    // zmienne
    static HolderOfUnmanagedStuff* unmanagedStuff = new HolderOfUnmanagedStuff();

    //funkcje
};

【讨论】:

  • 一些解释会有所帮助。 static 在创建类类型的指针变量时需要什么,我们会失去 OOP 对吗?可以在托管类析构函数中使用delete unmanagedStuff 吗?还是会引入内存泄漏?谢谢
  • static 是因为 OP 就是这样设置的。如果是非静态的,delete 是必需的 以防止内存泄漏。
猜你喜欢
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多