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

Memory Vala中原始指针和弱引用之间的区别?,memory,vala,Memory,Vala,(1)弱引用之间的区别是什么 weak SomeType weak_ref = hard_ref; 或 一方面,与原始指针类似 SomeType* raw_ptr = hard_ref; 另一方面,从实用的角度来看, 起初,我认为弱引用会自动重置为null,就像它们在Java中那样,但显然不是这样。文档只比较弱引用和硬引用,但没有提到原始指针。我错过什么了吗 (2)此外: Vala中是否有任何概念允许在引用对象最终确定时将弱引用或原始指针自动重置为null Java中的WeakHashMa

(1)弱引用之间的区别是什么

weak SomeType weak_ref = hard_ref;

一方面,与原始指针类似

SomeType* raw_ptr = hard_ref;
另一方面,从实用的角度来看,

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

(2)此外:

  • Vala中是否有任何概念允许在引用对象最终确定时将弱引用或原始指针自动重置为
    null
  • Java中的
    WeakHashMap
    Collections.newSetFromMap
    函数在Vala中是否有对应的类

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

      • 您可以对原始指针而不是弱引用调用
        delete
      • 原始指针可以堆叠,但引用不能堆叠(即,您可以使用
        Foo**
        ,但对于引用没有等效的方法)
      • 如果一个类型可以被复制或引用计数,当您将一个弱引用分配给一个强引用时,会发生一些合理的事情。对于原始指针,内存管理完全取决于您
      您可以创建弱指针的集合(例如,
      ArrayList
      )。Java的
      WeakHashMap
      基于有一个垃圾收集器,而Vala中没有垃圾收集器。引用超出范围并被确定地清除,而不是由于内存压力


      <>听起来像你想要的是C++的代码> STD::Vala,它是类似的。一个<代码> WeakRef <代码>可以保存一个可能被放置的指针,并且将在请求时返回一个强引用或null。它只适用于派生自<代码> GLUB的类。对象< /C> >。与C++版本不同,它不是静态类型。-安全(尽管它是运行时类型安全的)。

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

      • 您可以对原始指针而不是弱引用调用
        delete
      • 原始指针可以堆叠,但引用不能堆叠(即,您可以使用
        Foo**
        ,但对于引用没有等效的方法)
      • 如果一个类型可以被复制或引用计数,当您将一个弱引用分配给一个强引用时,会发生一些合理的事情。对于原始指针,内存管理完全取决于您
      您可以创建弱指针的集合(例如,
      ArrayList
      )。Java的
      WeakHashMap
      基于有一个垃圾收集器,而Vala中没有垃圾收集器。引用超出范围并被确定地清除,而不是由于内存压力


      <>听起来像你想要的是C++的代码> STD::Vala,它是类似的。一个<代码> WeakRef <代码>可以保存一个可能被放置的指针,并且将在请求时返回一个强引用或null。它只适用于派生自<代码> GLUB的类。对象< /C> >。与C++版本不同,它不是静态类型。-安全(尽管它是运行时类型安全的)。

      我目前的理解是:

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

        • 目前我个人的理解是:

          • 指针-Vala的优点之一是它维护了C ABI。这有利于使用和编写共享库。Vala提供了C中存在的间接运算符*,以及运算符的地址-。我认为这些通常不应该在Vala代码中使用,但应该在少数情况下使用,当您需要做一些不必要的事情时通常使用C库,或者您希望编写管理自己内存的代码
          • 所有权-C和Vala都对变量使用块作用域,Vala通过其辅助内存管理提供了优于C的优势。这意味着,与C不同,堆分配的资源不需要手动释放。请注意,“释放”包括递减对象的引用计数。如果要在Vala中关闭此行为,请将变量标记为无主,这意味着Vala不会尝试释放块末尾的资源。由于Vala生成C代码,C编译器仍将自动释放块中任何堆栈分配的变量
            SomeType* raw_ptr = hard_ref;