⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 newdelete.html

📁 关于 C++ 的历史无须我来介绍了
💻 HTML
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

  
  <link rel="stylesheet" href="css/stdlayout.css" type="text/css">

  
  <link rel="stylesheet" href="css/print.css" type="text/css">

  
  <meta content="text/html; charset=gb2312" http-equiv="content-type">

  
  <title>new 运算子与 delete 运算子</title>
</head>


<body>

<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>

<h1><a href="CppGossip.html">C++ Gossip:&nbsp;<span class="Topic">new
运算子与 delete 运算子</span><br>

</a></h1>

到目前为止,您都是事先宣告好所要使用的变数,当程式开始执行时,这些变数就会自动被配置记忆体空间。 <br>

<br>

然而有时有些变数并不知道何时会被使用,您希望在使用到的时候再配置空间给变数,并在变数不使用的时候,将变数所占有的空间还给记忆体,这时候我们可以使
用new运算子与delete运算子。 <br>

<br>

举个简单的例子来说,您可以在程式中以动态的方式来配置一个int型态大小的记忆体,例如: <br>

<div style="margin-left: 40px;"><span style="font-weight: bold; font-family: Courier New,Courier,monospace;">int
*ptr = new int;</span><br>

</div>

<br>

在这段程式中,new运算子会配置一个int所需要的空间,并传回该空间的位址,所以您使用指标ptr来储存这个位址,这段程式只配置空间但不初始空间中
的储存值,如果要在配置完成后指定储存值,则可以如此宣告: <br>

<div style="margin-left: 40px; font-family: Courier New,Courier,monospace;"><span style="font-weight: bold;">int
*ptr = new int(100);</span><br>

</div>

<br>

这段程式在配置空间之后,会将空间中的储存值设定为100,以下使用一个简单的程式来示范动态配置的使用:<br>

<br>

<pre>#include &lt;iostream&gt; <br>using namespace std; <br><br>int main() {<br>    int *ptr = new int(100); <br><br>    cout &lt;&lt; "空间位置:" &lt;&lt; ptr <br>         &lt;&lt; endl; <br>    cout &lt;&lt; "空间储存值:" &lt;&lt; *ptr<br>         &lt;&lt; endl; <br><br>    *ptr = 200; <br><br>    cout &lt;&lt; "空间位置:" &lt;&lt; ptr <br>         &lt;&lt; endl;<br>    cout &lt;&lt; "空间储存值:" &lt;&lt; *ptr <br>         &lt;&lt; endl;<br><br>    delete ptr;<br>    <br>    return 0; <br>}</pre>

<br>

执行结果:<br>

<table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">

  <tbody>

    <tr>

      <td style="background-color: rgb(0, 0, 0);"><small><span style="color: rgb(255, 255, 255);">空间位置:0x3d2458<br>

空间储存值:100<br>

空间位置:0x3d2458<br>

空间储存值:200</span></small><span style="color: rgb(255, 255, 255);"><br>

      </span></td>

    </tr>

  
  </tbody>
</table>

<br>

使用new运算子动态配置的空间,在整个程式结束前并不会自动归还给记忆体,您必须使用delete将这个空间还给记忆体,如上面的程式在结束前所作的动
作,在这个程式中,虽然显示完毕后程式也就结束,但这边还是示范delete的用法,而这也是个好习惯,日后您的程式在持续执行过程中若大量使用new而
没有适当的使用delete的话,由于空间一直没有归还,最后将导致整个记忆体空间用尽。 <br>

<br>

接下来看一个简单的动态记忆体配置的应用,您知道阵列使用的一个缺点,就是阵列的大小必须事先决定好,然而有时候您无法知道我们会使用多大的阵列,或者希
望由使用者自行决定阵列大小,这时候您就可以使用动态记忆体配置加上指标运算来解决这个问题,先说明阵列动态配置的方式,如下所示: <br>

<div style="margin-left: 40px;"><span style="font-weight: bold; font-family: Courier New,Courier,monospace;">int *arr = new
int[1000];</span><br>

</div>

<br>

这段程式码动态配置了1000个int大小的空间,并传回空间的第一个位址,配置后的空间资料是未知的,没有方法在动态配置阵列空间后同时宣告元素初值。<br>

<br>

同样的,使用new配置得来的空间,在不使用时应该使用delete归还给记忆体,方法如下: <br>

<div style="margin-left: 40px;"><span style="font-weight: bold; font-family: Courier New,Courier,monospace;">delete [] arr;</span><br>

</div>

<br>

注意在使用delete归还阵列空间给记忆体时,我们必须加上[ ],表示归还的是整个阵列空间。 <br>

<br>

下面这个程式是个阵列动态配置的简单示范: <br>

<br>

<pre>#include &lt;iostream&gt; <br>using namespace std; <br><br>int main() {<br>    int size = 0; <br><br>    cout &lt;&lt; "请输入阵列长度:"; <br>    cin &gt;&gt; size; <br>    int *arr = new int[size]; <br><br>    cout &lt;&lt; "指定元素值:" &lt;&lt; endl; <br>    for(int i = 0; i &lt; size; i++) { <br>        cout &lt;&lt; "arr[" &lt;&lt; i &lt;&lt; "] = "; <br>        cin &gt;&gt; *(arr+i); <br>    } <br><br>    cout &lt;&lt; "显示元素值:" &lt;&lt; endl; <br>    for(int i = 0; i &lt; size; i++) {<br>        cout &lt;&lt; "arr[" &lt;&lt; i &lt;&lt; "] = " &lt;&lt; *(arr+i)<br>             &lt;&lt; endl; <br>    } <br><br>    delete [] arr; <br>   <br>    return 0; <br>}<br></pre>

<br>

执行结果:<br>

<table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">

  <tbody>

    <tr>

      <td style="background-color: rgb(0, 0, 0);"><small><span style="color: rgb(255, 255, 255);">请输入阵列长度:5<br>

指定元素值:<br>

arr[0] = 1<br>

arr[1] = 2<br>

arr[2] = 3<br>

arr[3] = 4<br>

arr[4] = 5<br>

显示元素值:<br>

arr[0] = 1<br>

arr[1] = 2<br>

arr[2] = 3<br>

arr[3] = 4<br>

arr[4] = 5</span></small><span style="color: rgb(255, 255, 255);"><br>

      </span></td>

    </tr>

  
  </tbody>
</table>

<br>

您也可以使用指标来模拟二维阵列,只要清楚二维阵列中的两个维度的索引值之位移量就可以了,这在 <a href="TwoDimArray.html">二维阵列</a> 中有谈到了,下面这个程式是个简单的示范: <br>

<br>

<pre>#include &lt;iostream&gt; <br>using namespace std; <br><br>int main() {<br>    int m = 0;<br>    int n = 0; <br><br>    cout &lt;&lt; "输入二维阵列维度:"; <br>    cin &gt;&gt; m &gt;&gt; n; <br><br>    int *ptr = new int[m*n]; <br>    <br>    for(int i = 0; i &lt; m; i++) {<br>        for(int j = 0; j &lt; n; j++) {<br>            *(ptr + n*i + j) = i+j; <br>        }<br>    }<br><br>    for(int i = 0; i &lt; m; i++) { <br>        for(int j = 0; j &lt; n; j++) {<br>            cout &lt;&lt; *(ptr+n*i+j) &lt;&lt; "\t"; <br>        }            <br>        cout &lt;&lt; endl; <br>    } <br><br>    delete [] ptr; <br>    <br>    return 0; <br>}<br></pre>

<br>

执行结果:<br>

<table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">

  <tbody>

    <tr>

      <td style="background-color: rgb(0, 0, 0);"><small><span style="color: rgb(255, 255, 255);">输入二维阵列维度:4 5<br>

0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4<br>

1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5<br>

2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6<br>

3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7</span></small><span style="color: rgb(255, 255, 255);"><br>

      </span></td>

    </tr>

  
  </tbody>
</table>

<br>

<br>

</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -