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

📄 第20章 指针二 为指针分配和释放空间.htm

📁 用非常通俗的语言介绍了C++和C
💻 HTM
📖 第 1 页 / 共 5 页
字号:
      <P>“<SPAN lang=en-us>new </SPAN>分配一段新的内存空间,然后将该内存空间的地址存入到变量p中。” 
      <P>所以,最终p中仍然是存储了一个变量的地址,只是,这是一个“无名”变量。 
      <P>  
      <P>指向原有的某个变量,和指向一段新分配的内存空间,有什么区别呢? 
      <P>“原有的变量”,可以比喻成指向一间原有的,并且有主的房间。而“新分配的内存空间”,则像是一个“临时建筑物”。我们必须在不用它的时候,主动将它拆迁。拆迁的工作由<SPAN 
      lang=en-us>delete</SPAN>来完成。 
      <P>  
      <P>当指针变量通过<SPAN lang=en-us> new 
      </SPAN>,而得到一个内存地址后,我们就可以像以前的所说的,通过该指针,通过*号,而对该内存地址(一个无名的变量),进行操作。 
      <P>如: 
      <P><SPAN lang=en-us>int* p = new int;</SPAN> 
      <P><SPAN lang=en-us>*p = 100;</SPAN> 
      <P><SPAN lang=en-us>cout &lt;&lt; *p &lt;&lt; endl;</SPAN> 
      <P>  
      <P>屏幕将输出100。 
      <P>  
      <H4><B><A name=20.2.2>20.2.2</A> 在<SPAN lang=en-us>new 
      </SPAN>时初始化内存的值</B></H4>
      <P>  
      <P><SPAN lang=en-us>new </SPAN>也可以在申请内存空间时,直接设置该段内存里要放点什么<SPAN 
      lang=en-us>.</SPAN> 
      <P>  
      <P>语法: 
      <P>  
      <P>指针变量 <SPAN lang=en-us>= <B>new</B> </SPAN>数据类型<B><SPAN 
      lang=en-us>(</SPAN>初值</B><SPAN lang=en-us><B>)</B>;</SPAN> 
      <P>  
      <P>这样,上例可以改为: 
      <P>  
      <P><SPAN lang=en-us>int* p = new int<B>(100)</B>;</SPAN> 
      <P><SPAN lang=en-us>cout &lt;&lt; *p &lt;&lt; endl;</SPAN> 
      <P>  
      <P><SPAN lang=zh-cn>如果你申请的是字符类型的空间</SPAN>,<SPAN 
      lang=zh-cn>并且想初始化为‘A':</SPAN> 
      <P>  
      <P>char* pchar = new char('A'); 
      <P>  
      <H4><B><SPAN lang=en-us><A name=20.2.3>20.2.3</A> delete</SPAN></B></H4>
      <P>  
      <P>语法: 
      <P><SPAN lang=en-us><B>delete</B> </SPAN>指针变量<SPAN lang=en-us>;</SPAN> 
      <P>  
      <P><SPAN lang=en-us>delete </SPAN>将释放指定指针所指向的内存空间。 
      <P>  
      <P>举例: 
      <P>  
      <P><SPAN lang=en-us>int* p;</SPAN> 
      <P><SPAN lang=en-us>p = new int;</SPAN> 
      <P>  
      <P><SPAN lang=en-us>*p = 100;</SPAN> 
      <P><SPAN lang=en-us>cout &lt;&lt; *p &lt;&lt; endl;</SPAN> 
      <P>  
      <P><SPAN lang=en-us>delete p;</SPAN> 
      <P>  
      <P><SPAN lang=en-us>system("PAUSE");</SPAN> 
      <P>  
      <P>注意,当一个指针接受<SPAN 
      lang=en-us>delete</SPAN>操作后,它就又成了一个“指向不明”的指针。尽管我们可以猜测它还是指向“原来的房子”,然而,事实上,那座“房子”已经被<SPAN 
      lang=en-us>delete</SPAN> “拆迁”掉了。 
      <P>  
      <H4><B><A name=20.2.4>20.2.4</A> 实验: <SPAN lang=en-us>new </SPAN>和<SPAN 
      lang=en-us> delete</SPAN></B></H4>
      <P>  
      <P>很简单的例子。 
      <P>第一步: 
      <P>首先,在CB新建一个控制台程序。然后把上一小节的代码放到<SPAN lang=en-us>main()</SPAN>函数内。运行。结果如下: 
      <P align=center>  
      <P align=center><IMG height=34 src="第20章 指针二 为指针分配和释放空间.files/ls20.h1.gif" 
      width=172 border=0> 
      <P align=center><SPAN lang=en-us>(new </SPAN>和<SPAN lang=en-us> 
      delete)</SPAN> 
      <P>  
      <P>按任意键退出后,保存工程<SPAN lang=en-us>(Ctrl + Shift + S)</SPAN>。 
      <P>  
      <P>第二步: 
      <P>接下来我们来观察指针变量被<SPAN 
      lang=en-us>delete</SPAN>之后,所指向的内存会是什么。但,这是一件犯了C、C++编程大忌的事:访问一个已经<SPAN 
      lang=en-us>delete</SPAN> 的指针的值。如果你最近运气很差,你的CB可能会被强行退出。所以,你明白我们为什么要先存盘了,对不? 

      <P>  
      <P>在前面的代码中,加入以下加粗加红的一行<SPAN lang=en-us>(</SPAN>同时,你也应注意我的加的注释<SPAN 
      lang=en-us>)</SPAN>: 
      <P>  
      <P><SPAN lang=en-us>int* p;</SPAN> 
      <P><SPAN lang=en-us>p = new int;</SPAN> 
      <P>  
      <P><SPAN lang=en-us>*p = 100;</SPAN> 
      <P><SPAN lang=en-us>cout &lt;&lt; *p &lt;&lt; endl;</SPAN> 
      <P>  
      <P><SPAN lang=en-us>delete p;&nbsp;&nbsp; 
      <B>&nbsp;//p</B></SPAN><B>所指向的内存空间已经被释放</B> 
      <P>  
      <P><B><FONT color=#ff0000><SPAN lang=en-us>cout &lt;&lt; *p &lt;&lt; 
      endl;&nbsp; </SPAN></FONT><SPAN lang=en-us>//</SPAN>我们故意去访问此时p所指的内存</B> 
      <P>  
      <P><SPAN lang=en-us>system("PAUSE");</SPAN> 
      <P>  
      <P>运行结果: 
      <P>  
      <P align=center><IMG height=53 src="第20章 指针二 为指针分配和释放空间.files/ls20.h2.gif" 
      width=173 border=0> 
      <P align=center>(访问<SPAN lang=en-us>delete</SPAN>之后的指针) 
      <P>  
      <P>44<SPAN lang=en-us>244844</SPAN>??在你的机器可能不是这个数,但一定同样是怪怪的值。<SPAN 
      lang=en-us> </SPAN>原来是好端端的100,现在却成了44<SPAN 
      lang=en-us>244844</SPAN>。不要问我这是为什么?昨天来时,美眉还住在这里一座别致小阁楼里,今日故地重游,这里竟成废墟一片,依稀只见破墙上尚有:<B>“拆!——城建局”</B>的字样?! 

      <P>  
      <P><SPAN lang=en-us>new </SPAN>是管建房的,而 <SPAN 
      lang=en-us>delete</SPAN>就一个字:拆! 
      <P>  
      <P><SPAN lang=zh-cn>请大家自行在CB上完成本实验。我没有提供本题的实际工程。</SPAN> 
      <H4><B><SPAN lang=en-us><A name=20.2.5>20.2.5</A> new </SPAN>和<SPAN 
      lang=en-us> delete </SPAN>的关系</B></H4>
      <P>  
      <P>如果只有“建房”而没有“拆房”,那么程序就会占用内存越来越多。所以,当使用<SPAN lang=en-us>new 
      </SPAN>为某个指针分配出内存空间后,一定要记得在不需要再使用时,用<SPAN lang=en-us>delete 
      </SPAN>删除。下面是一个例子。演示<SPAN lang=en-us>new </SPAN>和<SPAN lang=en-us> delete 
      </SPAN>的对应使用。 
      <P>  
      <P><SPAN lang=en-us>//</SPAN>建屋和入住: 
      <P><SPAN lang=en-us>1) int* p = new int(100);</SPAN> 
      <P>  
      <P><SPAN lang=en-us>//</SPAN>使用: 
      <P><SPAN lang=en-us>2) cout &lt;&lt; *p &lt;&lt; endl;</SPAN> 
      <P>  
      <P><SPAN lang=en-us>//</SPAN>拆: 
      <P><SPAN lang=en-us>3) delete p;</SPAN> 
      <P>  
      <P>看,第1句,申请了4字节的内存空间,同时存入值为100的整数。 
      <P>第2句,在屏幕上输出入住者的值<SPAN lang=en-us> (100)</SPAN>。 
      <P>第3句,释放内存(这4字节被系统收回准备做其它用途)。入住者呢?自然消失了。 
      <P>  
      <P>前面举的例子都是在<SPAN lang=en-us> new </SPAN>一个<SPAN lang=en-us> int 
      </SPAN>类型,其它类型也一样: 
      <P>  
      <P><SPAN lang=en-us>char* a = new char('A');</SPAN> 
      <P><SPAN lang=en-us>cout &lt;&lt; *a &lt;&lt; endl;</SPAN> 
      <P><SPAN lang=en-us>*a = 'B';</SPAN> 
      <P><SPAN lang=en-us>cout &lt;&lt; *a &lt;&lt; end;</SPAN> 
      <P><SPAN lang=en-us>delete a;</SPAN> 
      <P>  
      <P><SPAN lang=en-us>bool* b = new bool;</SPAN> 
      <P><SPAN lang=en-us>*b = true;</SPAN> 
      <P>  
      <P><SPAN lang=en-us>if (*b)</SPAN> 
      <P><SPAN lang=en-us>&nbsp;&nbsp; cout &lt;&lt; "true" &lt;&lt; 
      endl;</SPAN> 
      <P><SPAN lang=en-us>else</SPAN> 
      <P><SPAN lang=en-us>&nbsp; cout &lt;&lt; "fale" &lt;&lt; endl;</SPAN> 
      <P>  
      <P>但是这些都是简单数据类型,如果要分配数组一样的连续空间,则需要使另一对武器。 
      <P>  
      <H3><B><A name=20.3><SPAN lang=en-us>20.3</SPAN></A><SPAN lang=zh-cn> 
      </SPAN><SPAN lang=en-us>new [] </SPAN>和<SPAN lang=en-us> delete 
      []</SPAN></B></H3>
      <P>  
      <P>new / delete <SPAN lang=zh-cn>用于分配和释放单个变量的空间,而</SPAN> new [] / delete[] 
      <SPAN lang=zh-cn>则用于分配连续多个变量的存间。</SPAN> 
      <P>  
      <H4><B><A name=20.3.1>20.3.1</A> new[] / delete[] <SPAN 
      lang=zh-cn>基本用法</SPAN></B></H4>
      <P>  
      <P><B>new [] 语法:</B> 
      <P>  
      <P>指针变量<SPAN lang=en-us> = <B>new</B> </SPAN>数据类型<B><SPAN 
      lang=en-us>[</SPAN>元素个数<SPAN lang=en-us>]</SPAN></B> 
      <P>  
      <P>语法实例: 
      <P>  
      <P><SPAN lang=en-us>int* p = new int[20];</SPAN> 
      <P>  
      <P>首先,你需要迅速回想一下,如果是<SPAN lang=en-us> int* p = new int(20); 
      </SPAN>那么该是什么作用?否则你很容易在事后把二者混了。 
      <P>  
      <P>实例中,用<SPAN lang=en-us> new </SPAN>申请分配了20个连续的整数所需的空间,即:<SPAN 
      lang=en-us>20 * sizeof(int) = 80</SPAN>个字节。 
      <P>图示为: 
      <P align=center><IMG height=395 
      src="第20章 指针二 为指针分配和释放空间.files/ls20.h3.gif" width=421 border=0> 
      <P align=center><SPAN lang=en-us>(</SPAN>指针变量p指向一段连续的内存空间<SPAN 
      lang=en-us>)</SPAN> 
      <P>  
      <P><SPAN lang=en-us>new int </SPAN>只是分配了一个整数的内存空间,而<SPAN lang=en-us> new 
      int[N]</SPAN>却分配了N个整数的连续空间。<SPAN lang=zh-cn>看来,</SPAN>new[] <SPAN 
      lang=zh-cn>比</SPAN> new <SPAN lang=zh-cn>“威力更猛”,所以,我们同样得记得:用</SPAN> new [] 
      <SPAN lang=zh-cn>分配出空间,当不在需要时,必须及时调用</SPAN> delete [] <SPAN 
      lang=zh-cn>来释放。</SPAN> 
      <P>  
      <P><B>delete [] <SPAN lang=zh-cn>语法:</SPAN></B> 
      <P>  
      <P>delete [] <SPAN lang=zh-cn>指针变量</SPAN>; 
      <P>  
      <P><SPAN lang=zh-cn>如:</SPAN> 
      <P>  
      <P>//<SPAN lang=zh-cn>分配了可以存放1000个</SPAN>int<SPAN 
      lang=zh-cn>的连续内存空间:</SPAN> 
      <P>int* p = new int[1000];&nbsp; 
      <P>  
      <P><SPAN lang=zh-cn>//然后使用这些空间:</SPAN> 
      <P><SPAN lang=zh-cn>……</SPAN> 
      <P>  
      <P><SPAN lang=zh-cn>//最后不需要了,及时释放:</SPAN> 
      <P><B>delete []</B> p; 
      <P>  
      <H4><B><A name=20.3.2>20.3.2</A> new []/ delete[] <SPAN 
      lang=zh-cn>示例</SPAN></B></H4>
      <P>  
      <P><SPAN lang=zh-cn>在</SPAN> Windows XP <SPAN lang=zh-cn>、</SPAN>Windows 
      NT<SPAN lang=zh-cn> 或</SPAN> Windows 2000<SPAN lang=zh-cn>中,按</SPAN> Ctrl 
      + Alt + Del (<SPAN lang=zh-cn>其它操作系统,如</SPAN>Windows98/Me<SPAN 
      lang=zh-cn>等千万不要按些组合键,否则电脑将重启</SPAN>)<SPAN lang=zh-cn>。可以调出 </SPAN>Windows 
      <SPAN 
      lang=zh-cn>任务管理器,其中要以看出当前粗略的的内存使用量。下面我们结合该工具,写一个程序,先分配100M的内存,再释放。</SPAN> 
      <P>  
      <P><SPAN lang=zh-cn>这是程序代码的抓图:</SPAN> 
      <P align=center><IMG height=298 
      src="第20章 指针二 为指针分配和释放空间.files/ls20.h11.gif" width=541 border=0> 
      <P>  
      <P><SPAN lang=zh-cn>各步运行结果: </SPAN>
      <TABLE id=AutoNumber3 style="BORDER-COLLAPSE: collapse" 
      borderColor=#111111 cellSpacing=0 cellPadding=0 width="100%" border=1>
        <TBODY>
        <TR>
          <TD width="60%"><SPAN lang=zh-cn>程序显示</SPAN></TD>
          <TD align=middle width="40%"><SPAN lang=zh-cn>任务管理器抓图</SPAN></TD></TR>
        <TR>
          <TD width="60%">
            <P align=center><SPAN lang=zh-cn>第一步:分配内存之前</SPAN> 
            <P align=center><IMG height=42 
            src="第20章 指针二 为指针分配和释放空间.files/ls20.h5.gif" width=353 align=middle 

⌨️ 快捷键说明

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