我正在使用这个课程:
public ref class x: public System::Windows::Forms::Form
{
private: gcroot<std::string> name;
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
IntelliSense: a member of a managed class cannot be of a non-managed class type
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用char*,但如果我使用了很多char*我将不得不手动做delete[]或者一些堆腐败问题会上升
我已经坚持了两天现在
注意:我必须使用c ++并且必须使用UI C++
这是gcroot <>的错误用法,如果您在非托管类中保留对托管对象的引用,则只需要这样做.
在这种情况下,您只需要声明它string*.一个指针,你不能在你的托管类中存储一个字符串对象,编译器确信你要射击你的腿.你会得到你现在得到的完全相同的错误信息.
真的很糟糕当垃圾收集器压缩gc堆并移动Form对象时,就会发生这种情况.这使得对字符串对象的任何外部非托管指针无效,而垃圾收集器无法更新该指针.例如,当您将对字符串的引用传递给非托管代码并且在执行非托管代码时发生GC时,可以生成这样的指针.指针现在不再有效,并且非托管代码在读取垃圾或破坏GC堆时失败.特别是后一种事故很难诊断出来.只调用一个std :: string成员方法就足以调用这个生成this指针的失败模式.
在托管对象中实际需要 std :: string 是非常不寻常的,你总是String^先选择.并且仅在需要时生成std :: string,通常是在调用本机代码时.如果在运行中创建std :: string非常昂贵,那么只考虑按照自己的方式进行操作.如果您这样做,那么在构造函数中创建std :: string对象.并在析构函数和终结器中再次销毁它.对于Form类来说,这是非常棘手的,因为它已经有一个析构函数和终结器,强烈考虑创建一个存储字符串的小助手类.