📄 newdelete.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: <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 <iostream> <br>using namespace std; <br><br>int main() {<br> int *ptr = new int(100); <br><br> cout << "空间位置:" << ptr <br> << endl; <br> cout << "空间储存值:" << *ptr<br> << endl; <br><br> *ptr = 200; <br><br> cout << "空间位置:" << ptr <br> << endl;<br> cout << "空间储存值:" << *ptr <br> << 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 <iostream> <br>using namespace std; <br><br>int main() {<br> int size = 0; <br><br> cout << "请输入阵列长度:"; <br> cin >> size; <br> int *arr = new int[size]; <br><br> cout << "指定元素值:" << endl; <br> for(int i = 0; i < size; i++) { <br> cout << "arr[" << i << "] = "; <br> cin >> *(arr+i); <br> } <br><br> cout << "显示元素值:" << endl; <br> for(int i = 0; i < size; i++) {<br> cout << "arr[" << i << "] = " << *(arr+i)<br> << 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 <iostream> <br>using namespace std; <br><br>int main() {<br> int m = 0;<br> int n = 0; <br><br> cout << "输入二维阵列维度:"; <br> cin >> m >> n; <br><br> int *ptr = new int[m*n]; <br> <br> for(int i = 0; i < m; i++) {<br> for(int j = 0; j < n; j++) {<br> *(ptr + n*i + j) = i+j; <br> }<br> }<br><br> for(int i = 0; i < m; i++) { <br> for(int j = 0; j < n; j++) {<br> cout << *(ptr+n*i+j) << "\t"; <br> } <br> cout << 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
1
2
3 4<br>
1
2
3
4 5<br>
2
3
4
5 6<br>
3
4
5
6 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 + -