Weak reference: Difference between revisions
imported>WikiCleanerBot m v2.05b - Bot T20 CW#61 - Fix errors for CW project (Reference before punctuation) |
→Java: Add namespace to Java example |
||
| Line 1: | Line 1: | ||
{{Short description|In programming, a reference which does not protect its object from garbage collection}} | {{Short description|In programming, a reference which does not protect its object from garbage collection}} | ||
In [[computer programming]], a '''weak reference''' is a [[reference (computer science)|reference]] that does not protect the referenced [[object (computer science)|object]] from collection by a [[garbage collection (computer science)|garbage collector]], unlike a strong reference. An object referenced ''only'' by weak references – meaning "every chain of references that reaches the object includes at least one weak reference as a link" – is considered ''[[weakly reachable]],'' and can be treated as [[unreachable memory|unreachable]] and so may be collected at any time. Some garbage-collected languages feature or support various levels of weak references, such as [[C Sharp (programming language)|C#]], [[Lua (programming language)|Lua]], [[Java (programming language)|Java]], [[Lisp (programming language)|Lisp]], [[OCaml]], [[MATLAB]],<ref>[https://uk.mathworks.com/help/matlab/matlab_oop/weak-reference-handles.html]</ref> [[Perl]], [[Python (programming language)|Python]]<ref>[https://docs.python.org/3/library/weakref.html 8.8. weakref — Weak references], The Python Standard Library</ref> and [[PHP]] since the version 7.4.<ref>{{Cite web|url=https://www.php.net/manual/en/class.weakreference.php|title = PHP: WeakReference - Manual}}</ref> | In [[computer programming]], a '''weak reference''' is a [[reference (computer science)|reference]] that does not protect the referenced [[object (computer science)|object]] from collection by a [[garbage collection (computer science)|garbage collector]], unlike a strong reference. An object referenced ''only'' by weak references – meaning "every chain of references that reaches the object includes at least one weak reference as a link" – is considered ''[[weakly reachable]],'' and can be treated as [[unreachable memory|unreachable]] and so may be collected at any time. Some garbage-collected languages feature or support various levels of weak references, such as [[C Sharp (programming language)|C#]], [[Lua (programming language)|Lua]], [[Java (programming language)|Java]], [[Lisp (programming language)|Lisp]], [[OCaml]], [[MATLAB]],<ref>[https://uk.mathworks.com/help/matlab/matlab_oop/weak-reference-handles.html]</ref> [[Perl]], [[Python (programming language)|Python]],<ref>[https://docs.python.org/3/library/weakref.html 8.8. weakref — Weak references], The Python Standard Library</ref> [[Racket (programming language)|Racket]], and [[PHP]] since the version 7.4.<ref>{{Cite web|url=https://www.php.net/manual/en/class.weakreference.php|title = PHP: WeakReference - Manual}}</ref> | ||
==Uses== | ==Uses== | ||
| Line 15: | Line 15: | ||
== Variations == | == Variations == | ||
Some languages have multiple levels of weak reference strength. For example, [[Java (programming language)|Java]] has, in order of decreasing strength, [[soft reference|soft]], weak, and [[phantom reference|phantom]] references, defined in the [[Java package|package]] [[Java Platform, Standard Edition#java.lang.ref|java.lang.ref]].<ref>{{cite web |last=Nicholas |first=Ethan |url=http://weblogs.java.net/blog/2006/05/04/understanding-weak-references |title=Understanding Weak References |work=java.net |date=May 4, 2006 |archive-url=https://web.archive.org/web/20110303225354/http://weblogs.java.net/blog/2006/05/04/understanding-weak-references |access-date=October 1, 2010|archive-date=2011-03-03 }}</ref> Each reference type has an associated notion of reachability. The garbage collector (GC) uses an object's type of reachability to determine when to free the object. It is safe for the GC to free an object that is softly reachable, but the GC may decide not to do so if it believes the JVM can spare the memory (e.g. the JVM has much unused heap space). The GC will free a weakly reachable object as soon as the GC notices the object. Unlike the other reference types, a phantom reference cannot be followed. On the other hand, phantom references provide a mechanism to notify the program when an object has been freed (notification is implemented using ReferenceQueues).<!-- what situations call for which type of reference --> | Some languages have multiple levels of weak reference strength. For example, [[Java (programming language)|Java]] has, in order of decreasing strength, [[soft reference|soft]], weak, and [[phantom reference|phantom]] references, defined in the [[Java package|package]] [[Java Platform, Standard Edition#java.lang.ref|{{mono|java.lang.ref}}]].<ref>{{cite web |last=Nicholas |first=Ethan |url=http://weblogs.java.net/blog/2006/05/04/understanding-weak-references |title=Understanding Weak References |work=java.net |date=May 4, 2006 |archive-url=https://web.archive.org/web/20110303225354/http://weblogs.java.net/blog/2006/05/04/understanding-weak-references |access-date=October 1, 2010|archive-date=2011-03-03 }}</ref> Each reference type has an associated notion of reachability. The garbage collector (GC) uses an object's type of reachability to determine when to free the object. It is safe for the GC to free an object that is softly reachable, but the GC may decide not to do so if it believes the JVM can spare the memory (e.g. the JVM has much unused heap space). The GC will free a weakly reachable object as soon as the GC notices the object. Unlike the other reference types, a phantom reference cannot be followed. On the other hand, phantom references provide a mechanism to notify the program when an object has been freed (notification is implemented using ReferenceQueues).<!-- what situations call for which type of reference --> | ||
In C#, weak references are distinguished by whether they track [[object resurrection]] or not. This distinction does not occur for strong references, as objects are not [[finalization|finalized]] if they have any strong references to them. By default, in C# weak reference do not track resurrection, meaning a weak reference is not updated if an object is resurrected; these are called '''short weak references''', and weak references that track resurrection are called '''long weak references'''.{{sfn|Goldshtein|Zurbalev|Flatow|2012|p=[https://books.google.com/books?id=D3J58cs-i44C&q=resurrection&pg=PA131 131]}} | In C#, weak references are distinguished by whether they track [[object resurrection]] or not. This distinction does not occur for strong references, as objects are not [[finalization|finalized]] if they have any strong references to them. By default, in C# weak reference do not track resurrection, meaning a weak reference is not updated if an object is resurrected; these are called '''short weak references''', and weak references that track resurrection are called '''long weak references'''.{{sfn|Goldshtein|Zurbalev|Flatow|2012|p=[https://books.google.com/books?id=D3J58cs-i44C&q=resurrection&pg=PA131 131]}} | ||
Some non-garbage-collected languages, such as [[C++]], provide weak/strong reference functionality as part of supporting garbage collection libraries. The Boost C++ library provides strong and weak references. | Some non-garbage-collected languages, such as [[C++]], provide weak/strong reference functionality as part of supporting garbage collection libraries. The Boost C++ library provides strong and weak references. It is a mistake to use regular C++ pointers as the ''weak'' counterparts of [[smart pointer]]s because such usage removes the ability to detect when the ''strong'' reference count has gone to 0 and the object has been deleted. Worse yet, it does not allow for detection of whether another strong reference is already tracking a given plain pointer. This introduces the possibility of having two (or more) smart pointers tracking the same plain pointer (which causes corruption as soon as one of these smart pointers' reference count reaches 0 and the object gets deleted). | ||
==Examples== | ==Examples== | ||
Weak references can be useful when keeping a list of the current variables being referenced in the application. This list must have weak links to the objects. Otherwise, once objects are added to the list, they will be referenced by it and will persist for the duration of the program. | Weak references can be useful when keeping a list of the current variables being referenced in the application. This list must have weak links to the objects. Otherwise, once objects are added to the list, they will be referenced by it and will persist for the duration of the program. | ||
===C++=== | |||
[[C++]] has a {{code|std::weak_ptr}} class, a kind of [[smart pointer]]. | |||
<syntaxhighlight lang="cpp"> | |||
import std; | |||
using std::shared_ptr; | |||
using std::weak_ptr; | |||
shared_ptr<int[]> myInts = std::make_shared<int[]>(5); | |||
weak_ptr<int[]> weakPtr = myInts; | |||
</syntaxhighlight> | |||
===C#=== | |||
[[C Sharp (programming language)|C#]] has the {{code|System.WeakReference}} class.<ref>{{cite web |title=Weak References - .NET |url=https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/weak-references |website=learn.microsoft.com |access-date=9 July 2025 |language=en-us}}</ref><ref>{{cite web |title=WeakReference Class (System) |url=https://learn.microsoft.com/en-us/dotnet/api/system.weakreference?view=net-9.0 |website=learn.microsoft.com |access-date=9 July 2025 |language=en-us}}</ref> | |||
<syntaxhighlight lang="csharp"> | |||
using System; | |||
using System.Collections.Generic; | |||
Dictionary<int, WeakReference>() myDict = new(); | |||
</syntaxhighlight> | |||
===Java=== | ===Java=== | ||
Java 1.2 in 1998 introduced<ref>{{cite web|url=http://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html|title=WeakReference (Java Platform SE 7 )|website=docs.oracle.com}}</ref> two kinds of weak references, one known as a "soft reference" (intended to be used for maintaining GC-managed in-memory caches, but which doesn't work very well in practice on some platforms with dynamic heap like Android<ref>{{cite web|url=https://developer.android.com/reference/java/lang/ref/SoftReference.html|title=SoftReference - Android Developers|website=developer.android.com}}</ref>) and the other simply as a "weak reference". It also added a related experimental mechanism dubbed "phantom references" as an alternative to the dangerous and inefficient <code>finalize()</code> mechanism.<ref>{{cite web|url=http://docs.oracle.com/javase/7/docs/api/java/lang/ref/PhantomReference.html|title=PhantomReference (Java Platform SE 7 )|website=docs.oracle.com}}</ref> | |||
If a weak reference is created, and then elsewhere in the code <code>get()</code> is used to get the actual object, the weak reference is not strong enough to prevent garbage collection, so it may be (if there are no strong references to the object) that <code>get()</code> suddenly starts returning null.<ref>https://web.archive.org/web/20110303225354/http://weblogs.java.net/blog/2006/05/04/understanding-weak-references Java Examples</ref> | |||
<syntaxhighlight lang="java"> | |||
package org.wikipedia.examples; | |||
import java.lang.ref.WeakReference; | import java.lang.ref.WeakReference; | ||
| Line 36: | Line 59: | ||
public static void main(String[] args) throws InterruptedException { | public static void main(String[] args) throws InterruptedException { | ||
WeakReference r = new WeakReference("I'm here"); | WeakReference r = new WeakReference("I'm here"); | ||
String s = "I'm here"; | |||
System.out. | System.out.printf("Before gc: r=%s, static=%s%n", r.get(), s); | ||
System.gc(); | System.gc(); // assume GC is run | ||
Thread.sleep(100); | Thread.sleep(100); | ||
// Only r.get() becomes null. | // Only r.get() becomes null. | ||
System.out. | System.out.printf("After gc: r=%s, static=%s%n", r.get(), s); | ||
} | } | ||
} | } | ||
| Line 49: | Line 72: | ||
===Smalltalk=== | ===Smalltalk=== | ||
<syntaxhighlight lang="smalltalk"> | |||
<syntaxhighlight lang= | |||
|a s1 s2| | |a s1 s2| | ||
| Line 70: | Line 92: | ||
===Lua=== | ===Lua=== | ||
<syntaxhighlight lang="lua"> | <syntaxhighlight lang="lua"> | ||
weak_table = setmetatable({}, {__mode="v"}) | weak_table = setmetatable({}, {__mode="v"}) | ||
| Line 81: | Line 102: | ||
===Objective-C 2.0=== | ===Objective-C 2.0=== | ||
In [[Objective-C]] 2.0, not only garbage collection, but also [[Reference counting|automatic reference counting]] will be affected by weak references. All variables and properties in the following example are weak. | In [[Objective-C]] 2.0, not only garbage collection, but also [[Reference counting|automatic reference counting]] will be affected by weak references. All variables and properties in the following example are weak. | ||
<syntaxhighlight lang=objc> | <syntaxhighlight lang="objc"> | ||
@interface WeakRef : NSObject | @interface WeakRef : NSObject | ||
{ | { | ||
| Line 95: | Line 116: | ||
The difference between <code>weak</code> (<code>__weak</code>) and <code>unsafe_unretained</code> (<code>__unsafe_unretained</code>) is that when the object the variable pointed to is being deallocated, whether the value of the variable is going to be changed or not. <code>weak</code> ones will be updated to [[Null pointer|<code>nil</code>]] and the <code>unsafe_unretained</code> one will be left unchanged, as a [[dangling pointer]]. The <code>weak</code> references is added to Objective-C since [[Mac OS X Lion|Mac OS X 10.7 "Lion"]] and [[iOS 5]], together with [[Xcode]] 4.1 (4.2 for iOS), and only when using ARC. Older versions of Mac OS X, iOS, and GNUstep support only <code>unsafe_unretained</code> references as weak ones. | The difference between <code>weak</code> (<code>__weak</code>) and <code>unsafe_unretained</code> (<code>__unsafe_unretained</code>) is that when the object the variable pointed to is being deallocated, whether the value of the variable is going to be changed or not. <code>weak</code> ones will be updated to [[Null pointer|<code>nil</code>]] and the <code>unsafe_unretained</code> one will be left unchanged, as a [[dangling pointer]]. The <code>weak</code> references is added to Objective-C since [[Mac OS X Lion|Mac OS X 10.7 "Lion"]] and [[iOS 5]], together with [[Xcode]] 4.1 (4.2 for iOS), and only when using ARC. Older versions of Mac OS X, iOS, and GNUstep support only <code>unsafe_unretained</code> references as weak ones. | ||
===[[Vala (programming language)|Vala]]=== | ===PHP=== | ||
[[PHP]] has the {{Mono|WeakReference}} class.<ref>{{cite web |title=PHP: WeakReference - Manual |url=https://www.php.net/manual/en/class.weakreference.php |website=www.php.net |access-date=9 July 2025 |language=en}}</ref> | |||
<syntaxhighlight lang="php"> | |||
$obj = new stdClass(); | |||
$weakref = WeakReference::create($obj); | |||
var_dump($weakref->get()); | |||
unset($obj); | |||
var_dump($weakref->get()); | |||
</syntaxhighlight> | |||
===Python=== | |||
[[Python (programming language)|Python]] has the {{Mono|weakref}} module.<ref>{{cite web |title=weakref — Weak references |url=https://docs.python.org/3/library/weakref.html |website=Python documentation |access-date=9 July 2025 |language=en}}</ref> | |||
<syntaxhighlight lang="python"> | |||
import gc | |||
import weakref | |||
from weakref import ReferenceType | |||
class Egg: | |||
def spam(self) -> None: | |||
print("I'm alive!") | |||
obj: Egg = Egg() | |||
weak_obj: ReferenceType[Egg] = weakref.ref(obj) | |||
weak_obj().spam() | |||
# prints: I'm alive! | |||
obj: str = "Something else" | |||
# gc.collect() returns an int | |||
print(f"Number of unreachable objects collected: {gc.collect()}") | |||
# prints: Number of unreachable objects collected: 35 | |||
weak_obj().spam() | |||
# Traceback (most recent call last): | |||
# File "<stdin>", line 1, in <module> | |||
# AttributeError: 'NoneType' object has no attribute 'spam' | |||
</syntaxhighlight> | |||
===Rust=== | |||
[[Rust (programming language)|Rust]] has a {{code|std::rc::Weak}} object. | |||
<syntaxhighlight lang="rust"> | |||
use std::rc::Rc; | |||
use std::rc::Weak; | |||
let strong_ptr: Rc<i32> = Rc::new(5); | |||
let weak_ptr: Weak<i32> = Rc::downgrade(&strong_ptr); | |||
</syntaxhighlight> | |||
===Vala=== | |||
[[Vala (programming language)|Vala]] has the {{Mono|weak}} keyword.<ref>{{cite web |title=4.9. Weak References - Vala Documentation |url=https://docs.vala.dev/tutorials/programming-language/main/04-00-advanced-features/04-09-weak-references.html |website=docs.vala.dev |access-date=9 July 2025}}</ref> | |||
<syntaxhighlight lang="vala"> | <syntaxhighlight lang="vala"> | ||
class Node { | class Node { | ||
| Line 101: | Line 170: | ||
public Node next; | public Node next; | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| Line 145: | Line 193: | ||
* [http://www.pawlan.com/monica/articles/refobjs/ Java developer article: 'Reference Objects and Garbage Collection'] | * [http://www.pawlan.com/monica/articles/refobjs/ Java developer article: 'Reference Objects and Garbage Collection'] | ||
* {{cite web |last=Nicholas |first=Ethan |url=http://weblogs.java.net/blog/2006/05/04/understanding-weak-references |title=Understanding Weak References |work=java.net |date=May 4, 2006 |archive-url=https://web.archive.org/web/20100819115659/http://weblogs.java.net/blog/2006/05/04/understanding-weak-references |access-date=October 1, 2010 |archive-date=August 19, 2010 |url-status=bot: unknown }} | * {{cite web |last=Nicholas |first=Ethan |url=http://weblogs.java.net/blog/2006/05/04/understanding-weak-references |title=Understanding Weak References |work=java.net |date=May 4, 2006 |archive-url=https://web.archive.org/web/20100819115659/http://weblogs.java.net/blog/2006/05/04/understanding-weak-references |access-date=October 1, 2010 |archive-date=August 19, 2010 |url-status=bot: unknown }} | ||
* [ | * [https://rcache.sourceforge.net/ RCache - Java Library for weak/soft reference based cache] | ||
* [http://www.ibm.com/developerworks/java/library/j-jtp11225/ Java theory and practice: Plugging memory leaks with weak references] | * [http://www.ibm.com/developerworks/java/library/j-jtp11225/ Java theory and practice: Plugging memory leaks with weak references] | ||
Latest revision as of 18:12, 7 November 2025
Template:Short description In computer programming, a weak reference is a reference that does not protect the referenced object from collection by a garbage collector, unlike a strong reference. An object referenced only by weak references – meaning "every chain of references that reaches the object includes at least one weak reference as a link" – is considered weakly reachable, and can be treated as unreachable and so may be collected at any time. Some garbage-collected languages feature or support various levels of weak references, such as C#, Lua, Java, Lisp, OCaml, MATLAB,[1] Perl, Python,[2] Racket, and PHP since the version 7.4.[3]
Uses
Weak references have a number of common uses. When using reference counting garbage collection, weak references can break reference cycles, by using a weak reference for a link in the cycle. When one has an associative array (mapping, hash map) whose keys are (references to) objects, for example to hold auxiliary data about objects, using weak references for the keys avoids keeping the objects alive just because of their use as keys. When one has an object where other objects are registered, such as in the observer pattern (particularly in event handling), if a strong reference is kept, objects must be explicitly unregistered, otherwise a memory leak occurs (the lapsed listener problem), while a weak reference removes the need to unregister. When holding cached data that can be recreated if necessary, weak references allow the cache to be reclaimed, effectively producing discardable memory. This last case (a cache) is distinct from others, as it is preferable that the objects only be garbage collected if necessary, and there is thus a need for finer distinctions within weak references, here a stronger form of a weak reference. In many cases weak references do not need to be directly used, instead simply using a weak array or other container whose keys or values are weak references.
Garbage collection
Script error: No such module "Labelled list hatnote". Garbage collection is used to clean up unused objects and so reduce the potential for memory leaks and data corruption. There are two main types of garbage collection: tracing and reference counting. Reference counting schemes record the number of references to a given object and collect the object when the reference count becomes zero. Reference-counting cannot collect cyclic (or circular) references because only one object may be collected at a time. Groups of mutually referencing objects which are not directly referenced by other objects and are unreachable can thus become permanently resident; if an application continually generates such unreachable groups of unreachable objects this will have the effect of a memory leak. Weak references (references which are not counted in reference counting) may be used to solve the problem of circular references if the reference cycles are avoided by using weak references for some of the references within the group.
A very common case of such strong vs. weak reference distinctions is in tree structures, such as the Document Object Model (DOM), where parent-to-child references are strong, but child-to-parent references are weak. For example, Apple's Cocoa framework recommends this approach.[4] Indeed, even when the object graph is not a tree, a tree structure can often be imposed by the notion of object ownership, where ownership relationships are strong and form a tree, and non-ownership relationships are weak and not needed to form the tree – this approach is common in C++ (pre-C++11), using raw pointers as weak references. This approach, however, has the downside of not allowing the ability to detect when a parent branch has been removed and deleted. Since the C++11 standard, a solution was added by using shared_ptr and weak_ptr, inherited from the Boost library.
Weak references are also used to minimize the number of unnecessary objects in memory by allowing the program to indicate which objects are of minor importance by only weakly referencing them.Script error: No such module "Unsubst".
Variations
Some languages have multiple levels of weak reference strength. For example, Java has, in order of decreasing strength, soft, weak, and phantom references, defined in the package <templatestyles src="Mono/styles.css" />java.lang.ref.[5] Each reference type has an associated notion of reachability. The garbage collector (GC) uses an object's type of reachability to determine when to free the object. It is safe for the GC to free an object that is softly reachable, but the GC may decide not to do so if it believes the JVM can spare the memory (e.g. the JVM has much unused heap space). The GC will free a weakly reachable object as soon as the GC notices the object. Unlike the other reference types, a phantom reference cannot be followed. On the other hand, phantom references provide a mechanism to notify the program when an object has been freed (notification is implemented using ReferenceQueues).
In C#, weak references are distinguished by whether they track object resurrection or not. This distinction does not occur for strong references, as objects are not finalized if they have any strong references to them. By default, in C# weak reference do not track resurrection, meaning a weak reference is not updated if an object is resurrected; these are called short weak references, and weak references that track resurrection are called long weak references.Template:Sfn
Some non-garbage-collected languages, such as C++, provide weak/strong reference functionality as part of supporting garbage collection libraries. The Boost C++ library provides strong and weak references. It is a mistake to use regular C++ pointers as the weak counterparts of smart pointers because such usage removes the ability to detect when the strong reference count has gone to 0 and the object has been deleted. Worse yet, it does not allow for detection of whether another strong reference is already tracking a given plain pointer. This introduces the possibility of having two (or more) smart pointers tracking the same plain pointer (which causes corruption as soon as one of these smart pointers' reference count reaches 0 and the object gets deleted).
Examples
Weak references can be useful when keeping a list of the current variables being referenced in the application. This list must have weak links to the objects. Otherwise, once objects are added to the list, they will be referenced by it and will persist for the duration of the program.
C++
C++ has a std::weak_ptr class, a kind of smart pointer.
import std;
using std::shared_ptr;
using std::weak_ptr;
shared_ptr<int[]> myInts = std::make_shared<int[]>(5);
weak_ptr<int[]> weakPtr = myInts;
C#
C# has the System.WeakReference class.[6][7]
using System;
using System.Collections.Generic;
Dictionary<int, WeakReference>() myDict = new();
Java
Java 1.2 in 1998 introduced[8] two kinds of weak references, one known as a "soft reference" (intended to be used for maintaining GC-managed in-memory caches, but which doesn't work very well in practice on some platforms with dynamic heap like Android[9]) and the other simply as a "weak reference". It also added a related experimental mechanism dubbed "phantom references" as an alternative to the dangerous and inefficient finalize() mechanism.[10]
If a weak reference is created, and then elsewhere in the code get() is used to get the actual object, the weak reference is not strong enough to prevent garbage collection, so it may be (if there are no strong references to the object) that get() suddenly starts returning null.[11]
package org.wikipedia.examples;
import java.lang.ref.WeakReference;
public class ReferenceTest {
public static void main(String[] args) throws InterruptedException {
WeakReference r = new WeakReference("I'm here");
String s = "I'm here";
System.out.printf("Before gc: r=%s, static=%s%n", r.get(), s);
System.gc(); // assume GC is run
Thread.sleep(100);
// Only r.get() becomes null.
System.out.printf("After gc: r=%s, static=%s%n", r.get(), s);
}
}
Another use of weak references is in writing a cache. Using, for example, a weak hash map, one can store in the cache the various referred objects via a weak reference. When the garbage collector runs — when for example the application's memory usage gets sufficiently high — those cached objects which are no longer directly referenced by other objects are removed from the cache.
Smalltalk
|a s1 s2|
s1 := 'hello' copy. "that's a strong reference"
s2 := 'world' copy. "that's a strong reference"
a := WeakArray with:s1 with:s2.
a printOn: Transcript.
ObjectMemory collectGarbage.
a printOn: Transcript. "both elements still there"
s1 := nil. "strong reference goes away"
ObjectMemory collectGarbage.
a printOn: Transcript. "first element gone"
s2 := nil. "strong reference goes away"
ObjectMemory collectGarbage.
a printOn: Transcript. "second element gone"
Lua
weak_table = setmetatable({}, {__mode="v"})
weak_table.item = {}
print(weak_table.item)
collectgarbage()
print(weak_table.item)
Objective-C 2.0
In Objective-C 2.0, not only garbage collection, but also automatic reference counting will be affected by weak references. All variables and properties in the following example are weak.
@interface WeakRef : NSObject
{
__weak NSString *str1;
__unsafe_unretained NSString *str2;
}
@property (nonatomic, weak) NSString *str3;
@property (nonatomic, unsafe_unretained) NSString *str4;
@end
The difference between weak (__weak) and unsafe_unretained (__unsafe_unretained) is that when the object the variable pointed to is being deallocated, whether the value of the variable is going to be changed or not. weak ones will be updated to nil and the unsafe_unretained one will be left unchanged, as a dangling pointer. The weak references is added to Objective-C since Mac OS X 10.7 "Lion" and iOS 5, together with Xcode 4.1 (4.2 for iOS), and only when using ARC. Older versions of Mac OS X, iOS, and GNUstep support only unsafe_unretained references as weak ones.
PHP
PHP has the <templatestyles src="Mono/styles.css" />WeakReference class.[12]
$obj = new stdClass();
$weakref = WeakReference::create($obj);
var_dump($weakref->get());
unset($obj);
var_dump($weakref->get());
Python
Python has the <templatestyles src="Mono/styles.css" />weakref module.[13]
import gc
import weakref
from weakref import ReferenceType
class Egg:
def spam(self) -> None:
print("I'm alive!")
obj: Egg = Egg()
weak_obj: ReferenceType[Egg] = weakref.ref(obj)
weak_obj().spam()
# prints: I'm alive!
obj: str = "Something else"
# gc.collect() returns an int
print(f"Number of unreachable objects collected: {gc.collect()}")
# prints: Number of unreachable objects collected: 35
weak_obj().spam()
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# AttributeError: 'NoneType' object has no attribute 'spam'
Rust
Rust has a std::rc::Weak object.
use std::rc::Rc;
use std::rc::Weak;
let strong_ptr: Rc<i32> = Rc::new(5);
let weak_ptr: Weak<i32> = Rc::downgrade(&strong_ptr);
Vala
Vala has the <templatestyles src="Mono/styles.css" />weak keyword.[14]
class Node {
public weak Node prev; // a weak reference is used to avoid circular references between nodes of a doubly-linked list
public Node next;
}
See also
References
<templatestyles src="Reflist/styles.css" />
- ↑ [1]
- ↑ 8.8. weakref — Weak references, The Python Standard Library
- ↑ Script error: No such module "citation/CS1".
- ↑ Script error: No such module "citation/CS1".
- ↑ Script error: No such module "citation/CS1".
- ↑ Script error: No such module "citation/CS1".
- ↑ Script error: No such module "citation/CS1".
- ↑ Script error: No such module "citation/CS1".
- ↑ Script error: No such module "citation/CS1".
- ↑ Script error: No such module "citation/CS1".
- ↑ https://web.archive.org/web/20110303225354/http://weblogs.java.net/blog/2006/05/04/understanding-weak-references Java Examples
- ↑ Script error: No such module "citation/CS1".
- ↑ Script error: No such module "citation/CS1".
- ↑ Script error: No such module "citation/CS1".
Script error: No such module "Check for unknown parameters". <templatestyles src="Refbegin/styles.css" />
- Script error: No such module "citation/CS1".
External links
C++
Java
- Java developer article: 'Reference Objects and Garbage Collection'
- Script error: No such module "citation/CS1".
- RCache - Java Library for weak/soft reference based cache
- Java theory and practice: Plugging memory leaks with weak references
PHP
Python
- weakref — Weak references — Python 3 documentation
- Fred L. Drake, Jr., PEP 205: Weak References, Python Enhancement Proposal, January 2001.