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

📄 subject_66201.htm

📁 vc
💻 HTM
字号:
<p>
序号:66201 发表者:皇帝也学C++ 发表日期:2003-12-23 10:26:21
<br>主题:求助,关于指针初始化和删除的问题
<br>内容:#include &lt;iostream&gt;<BR>using namespace std;<BR><BR>class Mammal<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;Mammal():itsAge(1) { }<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~Mammal() { }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual void Speak() const { cout &lt;&lt; &#34;Mammal speak!\n&#34;; }<BR>protected:<BR>&nbsp;&nbsp;&nbsp;&nbsp;int itsAge;<BR>};<BR><BR>class Dog : public Mammal<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;void Speak()const { cout &lt;&lt; &#34;Woof!\n&#34;; }<BR>};<BR><BR><BR>class Cat : public Mammal<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;void Speak()const { cout &lt;&lt; &#34;Meow!\n&#34;; }<BR>};<BR><BR><BR>class Horse : public Mammal<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;void Speak()const { cout &lt;&lt; &#34;Winnie!\n&#34;; }<BR>};<BR><BR>class Pig : public Mammal<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;void Speak()const { cout &lt;&lt; &#34;Oink!\n&#34;; }<BR>};<BR><BR>int main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;Mammal* theArray[5];<BR>&nbsp;&nbsp;&nbsp;&nbsp;Mammal* ptr;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int choice, i;<BR>&nbsp;&nbsp;&nbsp;&nbsp;for ( i = 0; i&lt;5; i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; &#34;(1)dog (2)cat (3)horse (4)pig: &#34;;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin &gt;&gt; choice;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch (choice)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 1: ptr = new Dog;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 2: ptr = new Cat;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 3: ptr = new Horse;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 4: ptr = new Pig;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default: ptr = new Mammal;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;theArray[i] = ptr;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;for (i=0;i&lt;5;i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;theArray[i]-&gt;Speak();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<BR>}<BR><BR>是teach yourself c++ in 21 days里的代码,程序运行没问题。问题是,没有对ptr和指针数组theArray初始化,而且也没有delete作善后处理,书上没作解释,是否不需要初始化和删除指针?
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:蓝白725 回复日期:2003-12-23 10:41:01
<br>内容:虽然在定义时没有初始化,但随后用new为ptr分配了内存空间,这样做也是可以的,但如果在ptr的定义和new之间就直接使用了ptr,那是会因为没有初始化而出现问题的<BR><BR>而由于程序中new的是对象,所以在这些对象的生命期结束时,会自动调用默认的构析函数来释放该对象占用的内存空间<BR><BR>个人认为,这种作法不是很规范,还是在定义时初始化比较安全。。。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:xiongli 回复日期:2003-12-23 10:43:31
<br>内容:初始化倒没有必要<BR>删除倒是一定要的。书上没有删除,书上错了。换本书看看吧
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:皇帝也学C++ 回复日期:2003-12-23 16:44:39
<br>内容:&lt;BLOCKQUOTE&gt;引用“第1楼”所言<BR>&lt;Q&gt;虽然在定义时没有初始化,但随后用new为ptr分配了内存空间,这样做也是可以的,但如果在ptr的定义和new之间就直接使用了ptr,那是会因为没有初始化而出现问题的&nbsp;&nbsp;&nbsp;&nbsp;而由于程序中new的是对象,所以在这些对象的生命期结束时,会自动调用默认的构析函数来释放该对象占用的内存空间&nbsp;&nbsp;&nbsp;&nbsp;个人认为,这种作法不是很规范,还是在定义时初始化比较安全。。。&lt;/Q&gt;&lt;/BLOCKQUOTE&gt;<BR>谢谢~<BR>有了新问题:似乎并未调用析构函数。<BR>以派生的Dog为例,将声明Dog的代码部分改为:<BR>class Dog : public Mammal<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;Dog() { cout&lt;&lt;&#34;Dog constructor...&#34;&lt;&lt;endl; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;~Dog() { cout&lt;&lt;&#34;Dog destructor...&#34;&lt;&lt;endl; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;void Speak()const { cout &lt;&lt; &#34;Woof!\n&#34;; }<BR>};<BR>试图在屏幕上显示出调用~Dog()时的信息,但结果并没有Dog destructor...的信息。倒是有Dog constructor...(这点可以理解,呵呵)<BR><BR>另外,如果将<BR>virtual ~Mammal() { }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>改为<BR>virtual ~Mammal() { cout &lt;&lt; &#34;Mammal destructor...&#34; &lt;&lt; endl; }&nbsp;&nbsp;&nbsp;&nbsp;<BR>屏幕上也并没有Mammal destructor...的信息提示,但如果在主函数的最后加上<BR>delete ptr;<BR>ptr = 0;<BR>两句后,屏幕上则有了Mammal destructor...的提示信息。尔后在这两句的前面和后面分别加了个“标签”,变成:<BR>cout &lt;&lt; &#34;**********************************&#34; &lt;&lt; endl;<BR>delete ptr;<BR>ptr = 0;<BR>cout &lt;&lt; &#34;**********************************&#34; &lt;&lt; endl;<BR>输出结果也显示出~Mammal()的调用是由于这两句引起的(?),但仍不知其所以然,请教。。。<BR><BR>2003-12-23 17:16:51

⌨️ 快捷键说明

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