C++中的混合管理



我在程序中添加了一个类并对其进行了测试。我真的很惊讶有任何真正的错误。这是代码:

#pragma once
#include "Iingredient.h"
#include <string>
#include <vector>
using namespace std;
ref class Recipe{
private:
    string partsName;
    vector<Iingredient> ing;
public:
    Recipe(){}
};

以下是错误:

错误23错误C4368:无法将"partsName"定义为托管的成员"配方":混合类型不是支持c:\users\user\documents\visualstudio2010\projects\smestras2_1\Recipe.h 10 1文件2_l1

错误24错误C4368:无法将"ing"定义为托管的成员"配方":混合类型不是支持c:\users\user\documents\visualstudio2010\projects\smestras2_1\Recipe.h 11 1文件2_l1

我在谷歌上搜索了一下,发现它是关于托管和非托管代码的。如何解决此问题?它是否与托管代码和非托管代码相关?如果是,如何?

我同意其他人的观点:在大多数情况下不应该使用C++/CLI,应该使用C#(或另一种"普通"托管语言)(假设您想编写.Net应用程序)。C++/CLI主要在特殊情况下很有用,比如在托管代码和非托管代码之间进行互操作。

如果您确定要使用C++/CLI,则不能将本机类放入托管类中。但是您可以将指针放在本地类中:

ref class Recipe{
private:
    string* partsName;
    vector<Iingredient>* ing;
};

上面的代码有效。但您必须记住,这些都是普通的本机C++指针,这意味着您必须手动delete它们。要实现该属性,您应该阅读有关析构函数和终结器在C++/CLI中如何工作的内容。

在定义ref class Recipe时,您将其管理。而CCD_ 3和CCD_。您正试图在托管类中声明本机变量,但这是不允许的。

看来,你是C++的新手。只是,不要使用C++/CLI。如果您的目标是.Net或非托管C++,请考虑C#。

不能在托管类ref关键字中使用非托管类型,因为堆和托管堆是两种不同类型的内存。要解决此特定问题,可以使用托管字符串类型(System::String^)。胡萝卜告诉编译器该类型是托管类的句柄。

解决此问题的另一种方法是使用指针,这样指针将位于托管堆上,而该对象的实际内存将位于标准非托管堆中,也就是Recipe所在的位置。

要构建Recipe类,您必须执行

Recipe^ recipe = gcnew Recipe();

由于不知道c++-cli,我可以尝试猜测问题是您正在定义一个引用类型,并试图在(std::string字段)中使用c++类型,而不是等效的托管类型(String?)。

这可能有问题的原因是它混合了资源管理方法。引用类型旨在从垃圾收集器中使用,除非实现析构函数或IDisposable,否则一旦证明最后一个引用丢失,就会被忽略。另一方面,为了能够管理内部字段中的内存,必须调用std::string析构函数。

相关内容

  • 没有找到相关文章

最新更新