blob: 06844eedd559941e116fea2feb8148ece3a4c308 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
---
title: 絕對可靠的記憶體配置
slug: Mozilla/Infallible_memory_allocation
tags:
- 分配
- 記憶體
translation_of: Mozilla/Infallible_memory_allocation
---
<div>{{gecko_minversion_header("2.0")}}</div>
<p>There's ongoing work to implement <strong>infallible memory allocators</strong>. These are memory allocation routines that never return <code>null</code>; that is, they always successfully return the requested block of memory. This is in contrast to a traditional, fallible memory allocator that can return <code>null</code> indicating that the request failed.</p>
<p>Currently, while code is transitioned to be compatible with infallible memory allocators, you have to explicitly decide whether to use infallible allocation or not. Eventually, however, the generic memory allocators (<code>malloc() </code>and<code> realloc()</code>) will become infallible.</p>
<h2 id="記憶體配置要怎樣才能萬無一失?"><a id="How can memory allocation be infallible" name="How can memory allocation be infallible"></a>記憶體配置要怎樣才能萬無一失?</h2>
<p>「萬無一失」這個詞代表了配置記憶體時絕對會成功:你的程式碼永遠不會看到請求失敗,也就無須對失敗的情況做出處置。</p>
<p>平常在配置記憶體時,情況則不太一樣。在有限記憶體的狀況下,記憶體配置是有可能失敗的。然而,在平常配置失敗的程序中程式將不會返回到你的程式碼中,而是直接停止程式。不過這情況可能有點少見,因為記憶體管理系統通常都會為你要求的記憶體想盡辦法找到空間。</p>
<h2 id="選擇記憶體分配器">選擇記憶體分配器</h2>
<p>當你在寫需要配置記憶體的程式時,可能需要遵守幾個規則以便幫助你決定是否在分配器使用萬無一失的策略:</p>
<ul>
<li>如果你可能需要分配大塊記憶體時,你就應該讓他可能出錯(像是使用 <code>moz_malloc()</code> ,並確保返回的結果不會是 <code>null</code>。就如在 <a href="#How can memory allocation be infallible">記憶體配置要怎樣才能萬無一失?</a> 一段中所述,在有限的記憶體中要求大塊記憶體時,分配器會找不到你所要求的記憶體,因此程式會直接停止。</li>
<li>如果你不確定記憶體是否會很大塊,就使用標準的 <code>malloc()</code> 來動作,它目前是可能出錯的,但最後可能會變成萬無一失,請確認 <code>null</code> 的結果。</li>
<li>在實例物件時,<code>new</code> 這個運算元預設會萬無一失地創造他們。如果你想要讓他們有機會出錯的話,就使用 <code>new (fallible) Foo()</code> 這個語法。</li>
<li>在有疑慮的時候,使用萬無一失分配器,且不要確認 <code>null</code> 的情況。</li>
<li>
<p><code>NS_Alloc()</code> 也是萬無一失的。</p>
</li>
</ul>
<h2 id="明示的萬無一失記憶體分配器">明示的萬無一失記憶體分配器</h2>
<p>下面的記憶體分配器都明確地標示出他們是萬無一失的,並且會一直保持下去。他們保證會回傳可用的記憶體指標:</p>
<pre>p = moz_xmalloc();
p = moz_xrealloc();
</pre>
<pre>f = new Foo();
fArray = new Foo[];
</pre>
<pre>n = ::operator new(...);
nArray = ::operator new[](...);
</pre>
<h2 id="Explicitly_fallible_memory_allocators">Explicitly fallible memory allocators</h2>
<p>These memory allocators are explicitly fallible, and will remain so. When using these, you must check to ensure the resulting value isn't <code>null</code> before attempting to use the returned memory.</p>
<pre>p = moz_malloc();
p = moz_realloc();
</pre>
<pre>namespace mozilla {
f = new (fallible) Foo();
fArray = new (fallible) Foo[];
}
</pre>
<pre>namespace mozilla {
n = ::operator new(..., fallible);
nArray = ::operator new[](..., fallible);
}
</pre>
<h2 id="最終萬無一失分配器">最終萬無一失分配器</h2>
<p>下面的記憶體目前是可能出錯的,但在未來將會變成萬無一失的:</p>
<pre>p = malloc();
p = realloc();
</pre>
<h2 id="你也可以參看">你也可以參看</h2>
<ul>
<li><a href="/en-US/docs/Choosing_the_right_memory_allocator" title="Choosing the right memory allocator">選擇正確的記憶體分配器</a></li>
<li><a href="/en-US/docs/NS_Alloc" title="NS Alloc"><code>NS_Alloc()</code></a></li>
</ul>
|