Vala 中原始指针和弱引用的区别?

Difference between raw pointers and weak references in Vala?

(1)weak references,like

有什么区别
weak SomeType weak_ref = hard_ref;

unowned SomeType unowned_ref = hard_ref;

一方面,原始指针喜欢

SomeType* raw_ptr = hard_ref;

另一方面,从实用的角度?

起初,我认为弱引用会像在 Java 中那样自动重置为 null,但显然不会。文档只比较弱引用和硬引用,但没有提到原始指针。我错过了什么吗?

(2) 此外:

弱引用和原始指针之间几乎没有区别:

  • 您可以在原始指针上调用 delete,但不能在弱引用上调用。
  • 原始指针可以堆叠,但引用不能(,你可以有Foo**,但没有等效的引用。
  • 如果一个类型可以被复制或引用计数,当您将弱引用分配给强引用时就会发生明智的事情。使用原始指针,内存管理完全取决于您。

您可以创建一组弱指针(例如ArrayList<unowned FileStream>)。 Java 的 WeakHashMap 是基于有一个垃圾收集器而 Vala 中没有垃圾收集器。引用超出范围并确定性地被清理,而不是内存压力的结果。

听起来你想要的是C++的std::weak_ptr。 Vala有WeakRef,类似。 WeakRef 可以保存一个可能已处置的指针,并将 return 对其进行强引用或根据要求为 null。不过,它仅适用于派生自 GLib.Object 的 类。与 C++ 版本不同,遗憾的是它不是静态类型安全的(尽管它是 运行 时间类型安全的)。

目前我自己的理解是:

  • 指针 - Vala 的优点之一是它维护了 C ABI。这有利于使用和编写共享库。 Vala 提供了 C 中存在的间接运算符 * 和寻址运算符 &,我认为这些通常不应该在 Vala 代码中使用,但应该在极少数情况下使用C 库有些不寻常,或者您想编写管理其自身内存的代码
  • 所有权 - C 和 Vala 都对变量使用块作用域,Vala 通过其辅助内存管理提供了优于 C 的优势。这意味着,与 C 不同,堆分配的资源不需要手动释放。请注意,"freeing" 包括递减对象的引用计数。如果你想在 Vala 中关闭这种行为,那么将变量标记为无主,这意味着 Vala 不会尝试在块的末尾释放资源。因为 Vala 生成 C 代码,C 编译器仍然会自动释放块中任何堆栈分配的变量,但 Vala 不会产生额外的代码来取消分配堆内存或减少引用计数。在大多数情况下,Vala 会做出明智的选择,但对于函数调用返回的常量字符串,您可能必须这样做。所以它们被标记为无主,因为不需要释放内存
  • Weak references - 这主要是为了避免双向引用造成引用计数循环,详细解释见Vala's Memory Management Explained。例子有一个双向链表