【问题标题】:C++ only using ^ instead of *?C++ 只使用 ^ 而不是 *?
【发布时间】:2016-01-15 11:07:31
【问题描述】:

例如我读到的

MyClass<T> ^ mc = new MyClass<T>();

给出一个 mc 句柄。

  1. 我可以像使用 *mc 一样使用 ^mc 吗?

我还读到,使用 ^mc 将在 cli-heap 中创建对象,该对象将自动清理,所以我不必使用 delete mc 然后。

这不是只使用 ^-handles 的论据吗?

【问题讨论】:

  • 这是一个 C++-CLI 扩展。

标签: .net pointers c++-cli handle


【解决方案1】:

^ 指针仅用于语言的 Microsoft 公共语言运行时修改。如果您使用它们,您将锁定您的项目以仅使用 Microsoft 编译器。如果您正在寻找可移植性,您应该使用必须手动删除的传统指针或使用新的 C++11 功能。

【讨论】:

    【解决方案2】:

    这是一个扩展,但您可以使用标准 C++ 实现类似的功能:

    auto mc = std::make_unique<MyClass<T>>();
    

    是的,这是使用std::unique_ptr 和/或std::shared_ptr 的好理由。

    【讨论】:

    • 您的最后一句话可能会被误导为建议在值足够的情况下使用指针。 shared_ptrs,当过度使用时,很有可能将代码纠缠成所有权不明的意大利面条。
    • 非常感谢,你的答案和 coladict 的答案将是完美的答案^^
    【解决方案3】:

    ^ 是托管指针。它相当于 CLI 的智能指针。

    我还读到,使用 ^mc 将在 cli-heap 中创建将自动清理的对象,因此我不必使用 delete mc

    是的,这是真的。 CLI 运行时有一个垃圾收集器。 但是 CLI 是 Windows 特有的东西,所以它不能在其他环境中工作。

    【讨论】:

    • .NET CoreCLR 现在是开源的(承诺提供 Linux 和 Mac 端口,我还没有检查它们是否已经到来)并且长期以来一直存在 Mono 作为 Linux 的替代品.
    • @coladict 我确实忘记了 Mono,我会编辑我的答案。
    • 另外,你不能写^mc,这是一个语法错误,你不能取消引用句柄。不过,您可以在上面使用 -&gt; 运算符。
    猜你喜欢
    • 2022-12-03
    • 2011-12-23
    • 1970-01-01
    • 2019-09-04
    • 2020-09-12
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多