gpt4 book ai didi

visual-c++ - Visual C++ 非托管和托管

转载 作者:行者123 更新时间:2023-12-04 14:05:41 26 4
gpt4 key购买 nike

在托管与非托管的 C++ 中创建 .NET 对象的实例有什么区别。也就是说,这些to语句有什么区别:

StreamWriter ^stream = gcnew StreamWriter(fileName);

相对
StreamWriter *stream = new StreamWriter(fileName);

我的假设是,如果我使用 gcnew,分配给 StreamWriter 的内存将由垃圾收集器管理。或者,如果我使用 pointer(*) 和 new 关键字,我将不得不调用 delete 来释放内存。

我真正的问题是:垃圾收集器会管理在 .NET 对象内部分配的内存吗?例如,如果一个 .NET 对象实例化另一个对象,并且它超出范围 - 即使我使用指针(*)和 new 关键字而不是 gcnew 和句柄(^),垃圾收集器是否会管理该内存。

最佳答案

在 C++/CLI 中,你不能 new .NET 对象,您将收到类似于以下错误的信息:

error C2750: 'System::Object' : cannot use 'new' on the reference type; use 'gcnew' instead


new的用法.NET 对象在旧的 C++ 托管扩展中是允许的( /clr:oldsyntax 编译器标志)。 “托管 C++”现在已被弃用,因为它太可怕了。它已被 C++/CLI 取代,后者引入了 ^gcnew .

在 C++/CLI 中,您必须使用 gcnew (和 ^ 句柄)用于托管类型,您必须使用 new (和 * 指针)用于 native 类型。如果您确实使用 new 在 native 堆上创建对象,您有责任在处理完它们后销毁它们。

理想情况下,您应该使用智能指针(如 std::shared_ptrstd::unique_ptr )来管理 native 堆上的对象。但是,由于您不能将 native 智能指针作为 ref 类的字段,因此这并不完全简单。最简单和最通用的方法可能是编写自己的智能指针包装引用类来正确实现 IDisposable .

关于visual-c++ - Visual C++ 非托管和托管,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5570887/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com