Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / devtools / v9 / html / python / ext / refcounts.html
CommitLineData
920dae64
AT
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2<html>
3<head>
4<link rel="STYLESHEET" href="ext.css" type='text/css' />
5<link rel="SHORTCUT ICON" href="../icons/pyfav.png" type="image/png" />
6<link rel='start' href='../index.html' title='Python Documentation Index' />
7<link rel="first" href="ext.html" title='Extending and Embedding the Python Interpreter' />
8<link rel='contents' href='contents.html' title="Contents" />
9<link rel='last' href='about.html' title='About this document...' />
10<link rel='help' href='about.html' title='About this document...' />
11<link rel="next" href="cplusplus.html" />
12<link rel="prev" href="buildValue.html" />
13<link rel="parent" href="intro.html" />
14<link rel="next" href="refcountsInPython.html" />
15<meta name='aesop' content='information' />
16<title>1.10 Reference Counts
17</title>
18</head>
19<body>
20<DIV CLASS="navigation">
21<div id='top-navigation-panel' xml:id='top-navigation-panel'>
22<table align="center" width="100%" cellpadding="0" cellspacing="2">
23<tr>
24<td class='online-navigation'><a rel="prev" title="1.9 Building Arbitrary Values"
25 href="buildValue.html"><img src='../icons/previous.png'
26 border='0' height='32' alt='Previous Page' width='32' /></A></td>
27<td class='online-navigation'><a rel="parent" title="1. Extending Python with"
28 href="intro.html"><img src='../icons/up.png'
29 border='0' height='32' alt='Up One Level' width='32' /></A></td>
30<td class='online-navigation'><a rel="next" title="1.10.1 Reference Counting in"
31 href="refcountsInPython.html"><img src='../icons/next.png'
32 border='0' height='32' alt='Next Page' width='32' /></A></td>
33<td align="center" width="100%">Extending and Embedding the Python Interpreter</td>
34<td class='online-navigation'><a rel="contents" title="Table of Contents"
35 href="contents.html"><img src='../icons/contents.png'
36 border='0' height='32' alt='Contents' width='32' /></A></td>
37<td class='online-navigation'><img src='../icons/blank.png'
38 border='0' height='32' alt='' width='32' /></td>
39<td class='online-navigation'><img src='../icons/blank.png'
40 border='0' height='32' alt='' width='32' /></td>
41</tr></table>
42<div class='online-navigation'>
43<b class="navlabel">Previous:</b>
44<a class="sectref" rel="prev" href="buildValue.html">1.9 Building Arbitrary Values</A>
45<b class="navlabel">Up:</b>
46<a class="sectref" rel="parent" href="intro.html">1. Extending Python with</A>
47<b class="navlabel">Next:</b>
48<a class="sectref" rel="next" href="refcountsInPython.html">1.10.1 Reference Counting in</A>
49</div>
50<hr /></div>
51</DIV>
52<!--End of Navigation Panel-->
53
54<H1><A NAME="SECTION0031000000000000000000"></A><A NAME="refcounts"></A>
55<BR>
561.10 Reference Counts
57
58</H1>
59
60<P>
61In languages like C or C++, the programmer is responsible for
62dynamic allocation and deallocation of memory on the heap. In C,
63this is done using the functions <tt class="cfunction">malloc()</tt> and
64<tt class="cfunction">free()</tt>. In C++, the operators <tt class="keyword">new</tt> and
65<tt class="keyword">delete</tt> are used with essentially the same meaning and
66we'll restrict the following discussion to the C case.
67
68<P>
69Every block of memory allocated with <tt class="cfunction">malloc()</tt> should
70eventually be returned to the pool of available memory by exactly one
71call to <tt class="cfunction">free()</tt>. It is important to call
72<tt class="cfunction">free()</tt> at the right time. If a block's address is
73forgotten but <tt class="cfunction">free()</tt> is not called for it, the memory it
74occupies cannot be reused until the program terminates. This is
75called a <i class="dfn">memory leak</i>. On the other hand, if a program calls
76<tt class="cfunction">free()</tt> for a block and then continues to use the block, it
77creates a conflict with re-use of the block through another
78<tt class="cfunction">malloc()</tt> call. This is called <i class="dfn">using freed memory</i>.
79It has the same bad consequences as referencing uninitialized data --
80core dumps, wrong results, mysterious crashes.
81
82<P>
83Common causes of memory leaks are unusual paths through the code. For
84instance, a function may allocate a block of memory, do some
85calculation, and then free the block again. Now a change in the
86requirements for the function may add a test to the calculation that
87detects an error condition and can return prematurely from the
88function. It's easy to forget to free the allocated memory block when
89taking this premature exit, especially when it is added later to the
90code. Such leaks, once introduced, often go undetected for a long
91time: the error exit is taken only in a small fraction of all calls,
92and most modern machines have plenty of virtual memory, so the leak
93only becomes apparent in a long-running process that uses the leaking
94function frequently. Therefore, it's important to prevent leaks from
95happening by having a coding convention or strategy that minimizes
96this kind of errors.
97
98<P>
99Since Python makes heavy use of <tt class="cfunction">malloc()</tt> and
100<tt class="cfunction">free()</tt>, it needs a strategy to avoid memory leaks as well
101as the use of freed memory. The chosen method is called
102<i class="dfn">reference counting</i>. The principle is simple: every object
103contains a counter, which is incremented when a reference to the
104object is stored somewhere, and which is decremented when a reference
105to it is deleted. When the counter reaches zero, the last reference
106to the object has been deleted and the object is freed.
107
108<P>
109An alternative strategy is called <i class="dfn">automatic garbage collection</i>.
110(Sometimes, reference counting is also referred to as a garbage
111collection strategy, hence my use of ``automatic'' to distinguish the
112two.) The big advantage of automatic garbage collection is that the
113user doesn't need to call <tt class="cfunction">free()</tt> explicitly. (Another claimed
114advantage is an improvement in speed or memory usage -- this is no
115hard fact however.) The disadvantage is that for C, there is no
116truly portable automatic garbage collector, while reference counting
117can be implemented portably (as long as the functions <tt class="cfunction">malloc()</tt>
118and <tt class="cfunction">free()</tt> are available -- which the C Standard guarantees).
119Maybe some day a sufficiently portable automatic garbage collector
120will be available for C. Until then, we'll have to live with
121reference counts.
122
123<P>
124While Python uses the traditional reference counting implementation,
125it also offers a cycle detector that works to detect reference
126cycles. This allows applications to not worry about creating direct
127or indirect circular references; these are the weakness of garbage
128collection implemented using only reference counting. Reference
129cycles consist of objects which contain (possibly indirect) references
130to themselves, so that each object in the cycle has a reference count
131which is non-zero. Typical reference counting implementations are not
132able to reclaim the memory belonging to any objects in a reference
133cycle, or referenced from the objects in the cycle, even though there
134are no further references to the cycle itself.
135
136<P>
137The cycle detector is able to detect garbage cycles and can reclaim
138them so long as there are no finalizers implemented in Python
139(<tt class="method">__del__()</tt> methods). When there are such finalizers, the
140detector exposes the cycles through the <a class="ulink" href="../lib/module-gc.html"
141 ><tt class="module">gc</tt>
142module</a> (specifically, the <code>garbage</code>
143variable in that module). The <tt class="module">gc</tt> module also exposes a way
144to run the detector (the <tt class="function">collect()</tt> function), as well as
145configuration interfaces and the ability to disable the detector at
146runtime. The cycle detector is considered an optional component;
147though it is included by default, it can be disabled at build time
148using the <b class="programopt">--without-cycle-gc</b> option to the
149<b class="program">configure</b> script on <span class="Unix">Unix</span> platforms (including Mac OS X)
150or by removing the definition of <code>WITH_CYCLE_GC</code> in the
151<span class="file">pyconfig.h</span> header on other platforms. If the cycle detector is
152disabled in this way, the <tt class="module">gc</tt> module will not be available.
153
154<P>
155
156<p><br /></p><hr class='online-navigation' />
157<div class='online-navigation'>
158<!--Table of Child-Links-->
159<A NAME="CHILD_LINKS"><STRONG>Subsections</STRONG></a>
160
161<UL CLASS="ChildLinks">
162<LI><A href="refcountsInPython.html">1.10.1 Reference Counting in Python</a>
163<LI><A href="ownershipRules.html">1.10.2 Ownership Rules</a>
164<LI><A href="thinIce.html">1.10.3 Thin Ice</a>
165<LI><A href="nullPointers.html">1.10.4 NULL Pointers</a>
166</ul>
167<!--End of Table of Child-Links-->
168</div>
169
170<DIV CLASS="navigation">
171<div class='online-navigation'>
172<p></p><hr />
173<table align="center" width="100%" cellpadding="0" cellspacing="2">
174<tr>
175<td class='online-navigation'><a rel="prev" title="1.9 Building Arbitrary Values"
176 href="buildValue.html"><img src='../icons/previous.png'
177 border='0' height='32' alt='Previous Page' width='32' /></A></td>
178<td class='online-navigation'><a rel="parent" title="1. Extending Python with"
179 href="intro.html"><img src='../icons/up.png'
180 border='0' height='32' alt='Up One Level' width='32' /></A></td>
181<td class='online-navigation'><a rel="next" title="1.10.1 Reference Counting in"
182 href="refcountsInPython.html"><img src='../icons/next.png'
183 border='0' height='32' alt='Next Page' width='32' /></A></td>
184<td align="center" width="100%">Extending and Embedding the Python Interpreter</td>
185<td class='online-navigation'><a rel="contents" title="Table of Contents"
186 href="contents.html"><img src='../icons/contents.png'
187 border='0' height='32' alt='Contents' width='32' /></A></td>
188<td class='online-navigation'><img src='../icons/blank.png'
189 border='0' height='32' alt='' width='32' /></td>
190<td class='online-navigation'><img src='../icons/blank.png'
191 border='0' height='32' alt='' width='32' /></td>
192</tr></table>
193<div class='online-navigation'>
194<b class="navlabel">Previous:</b>
195<a class="sectref" rel="prev" href="buildValue.html">1.9 Building Arbitrary Values</A>
196<b class="navlabel">Up:</b>
197<a class="sectref" rel="parent" href="intro.html">1. Extending Python with</A>
198<b class="navlabel">Next:</b>
199<a class="sectref" rel="next" href="refcountsInPython.html">1.10.1 Reference Counting in</A>
200</div>
201</div>
202<hr />
203<span class="release-info">Release 2.4.2, documentation updated on 28 September 2005.</span>
204</DIV>
205<!--End of Navigation Panel-->
206<ADDRESS>
207See <i><a href="about.html">About this document...</a></i> for information on suggesting changes.
208</ADDRESS>
209</BODY>
210</HTML>