c++ - 具有非托管成员的托管类

标签 c++ clr

我正在使用这个类:

public ref class x: public System::Windows::Forms::Form
{ 
     private: gcroot<std::string> name;
}

我收到以下错误:

IntelliSense: a member of a managed class cannot be of a non-managed class type

我知道我可以使用 char*,但是如果我使用很多 char*,我将不得不手动执行 delete[]或者会出现一些堆损坏问题

我已经坚持了两天了

注意:我必须使用 c++ 并且必须在 c++ 中使用 UI

最佳答案

这是 gcroot<> 的错误用法,只有当您在非托管类中保留对托管 对象的引用时才需要它。

在这种情况下你只需要声明它string*。一个指针,你不能在你的托管类中存储一个字符串对象,编译器确信你会打断你的腿。您将收到与现在完全相同的错误消息。

当垃圾收集器压缩 gc 堆并移动 Form 对象时,可能会发生非常糟糕的事情。这会使指向字符串对象的任何外部非托管指针无效,而垃圾收集器无法更新该指针。例如,当您将对字符串的引用传递给非托管代码并且 GC 在该非托管代码执行时发生时,可以生成这样的指针。该指针现在不再有效,非托管代码在读取垃圾或损坏 GC 堆时失败。特别是后一种事故极难诊断。只需调用 std::string 成员方法之一就足以调用此故障模式,它会生成 this 指针。

在托管对象中实际需要 std::string 是非常不寻常的,您总是首先选择 String^。并仅在需要时生成 std​​::string,通常是在调用 native 代码时。只有在动态创建 std::string 非常昂贵时才考虑按照自己的方式进行。如果这样做,则在构造函数中创建 std::string 对象。并在析构函数和终结器中再次销毁它。由于 Form 类已经具有析构函数和终结器,因此很难正确处理它,强烈建议您考虑创建一个用于存储字符串的小辅助类。

关于c++ - 具有非托管成员的托管类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20173189/

相关文章:

c++ - C++ 桌面应用程序中的网页

java - CLR 是否与 Java(作为一种语言)不兼容?

c# - 为什么是 "Finalize method should not reference any other objects"?

c++ - 无法在 Fedora 上连接冰淇淋 (icecc)

c++ - 如何将 UTF-8 std::string 转换为 UTF-16 std::wstring?

c++ - this-> 是否必须从派生类访问 Base<T> 标识符?

c++ - 在 C++ 中使用::(范围解析运算符)

c# - 新的 C# 异步功能是否在编译器中严格实现

c# - VS2010 与 VS2008 中的字符串排序性能下降

c# - 如何创建和访问数组