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

时间:2016-08-18 09:25:06

标签: memory vala

(1) 弱引用之间有什么区别,比如

weak SomeType weak_ref = hard_ref;

unowned SomeType unowned_ref = hard_ref;

一方面和原始指针一样

SomeType* raw_ptr = hard_ref;

另一方面,从实际角度来看

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

(2)此外:

  • 是否在Vala中有任何概念允许在引用的对象完成时自动将弱引用或原始指针重置为null
  • 并且 是否有类似WeakHashMap或者Vala中可用的Collections.newSetFromMap函数的类的对应项?

2 个答案:

答案 0 :(得分:3)

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

  • 您可以在原始指针上调用delete,但不能在弱引用上调用。
  • 可以堆叠原始指针,但引用不能(,你可以拥有Foo**,但是没有相应的引用。
  • 如果可以复制或引用类型,则在为强引用指定弱引用时会发生明显的事情。使用原始指针,内存管理完全取决于您。

您可以创建一个弱指针集合(例如ArrayList<unowned FileStream>)。 Java的WeakHashMap基于垃圾收集器,Vala中没有垃圾收集器。参考文献超出范围并确定性地进行清理,而不是作为记忆压力的结果。

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

答案 1 :(得分:0)

我目前的理解是:

  • 指针 - Vala的优点之一是它保持了C ABI。这对于使用和编写共享库很有用。 Vala提供了存在于C中的间接运算符*和地址运算符&amp ;.我不认为这些通常应该用在Vala代码中,但是在极少数情况下应该用于需要用C库做一些不寻常的事情,或者你想编写管理自己内存的代码
  • 所有权--C和Vala都使用块变量范围,Vala通过其辅助内存管理提供了优于C的优势。这意味着,与C不同,堆分配的资源不需要手动释放。注意&#34;释放&#34;包括递减对象的引用计数。如果要在Vala中关闭此行为,请将变量标记为无主,这意味着Vala不会尝试释放块末尾的资源。由于Vala生成C代码,C编译器仍将自动释放块中任何堆栈分配的变量,但Vala不会产生用于取消分配堆内存或减少引用计数的附加代码。在大多数情况下,Vala是明智的选择,但您可能必须对函数调用返回的常量字符串执行此操作。所以他们被标记为无主,因为记忆不需要被释放
  • 弱引用 - 这主要用于避免双向引用导致引用计数中的循环,详细解释在Vala's Memory Management Explained中给出。这个例子有一个双向链表