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) 此外:
- Vala 中是否有 允许在引用对象完成时自动将弱引用或原始指针重置为
null
的概念?
- 和是 类 有没有像
WeakHashMap
或Java 中的Collections.newSetFromMap
函数在Vala 中可用的对应物?
弱引用和原始指针之间几乎没有区别:
- 您可以在原始指针上调用
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。例子有一个双向链表
(1)weak references,like
有什么区别weak SomeType weak_ref = hard_ref;
或
unowned SomeType unowned_ref = hard_ref;
一方面,原始指针喜欢
SomeType* raw_ptr = hard_ref;
另一方面,从实用的角度?
起初,我认为弱引用会像在 Java 中那样自动重置为 null
,但显然不会。文档只比较弱引用和硬引用,但没有提到原始指针。我错过了什么吗?
(2) 此外:
- Vala 中是否有 允许在引用对象完成时自动将弱引用或原始指针重置为
null
的概念? - 和是 类 有没有像
WeakHashMap
或Java 中的Collections.newSetFromMap
函数在Vala 中可用的对应物?
弱引用和原始指针之间几乎没有区别:
- 您可以在原始指针上调用
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。例子有一个双向链表