📄 subject_66201.htm
字号:
<p>
序号:66201 发表者:皇帝也学C++ 发表日期:2003-12-23 10:26:21
<br>主题:求助,关于指针初始化和删除的问题
<br>内容:#include <iostream><BR>using namespace std;<BR><BR>class Mammal<BR>{<BR>public:<BR> Mammal():itsAge(1) { }<BR> virtual ~Mammal() { } <BR> virtual void Speak() const { cout << "Mammal speak!\n"; }<BR>protected:<BR> int itsAge;<BR>};<BR><BR>class Dog : public Mammal<BR>{<BR>public:<BR> void Speak()const { cout << "Woof!\n"; }<BR>};<BR><BR><BR>class Cat : public Mammal<BR>{<BR>public:<BR> void Speak()const { cout << "Meow!\n"; }<BR>};<BR><BR><BR>class Horse : public Mammal<BR>{<BR>public:<BR> void Speak()const { cout << "Winnie!\n"; }<BR>};<BR><BR>class Pig : public Mammal<BR>{<BR>public:<BR> void Speak()const { cout << "Oink!\n"; }<BR>};<BR><BR>int main()<BR>{<BR> Mammal* theArray[5];<BR> Mammal* ptr;<BR> int choice, i;<BR> for ( i = 0; i<5; i++)<BR> {<BR> cout << "(1)dog (2)cat (3)horse (4)pig: ";<BR> cin >> choice;<BR> switch (choice)<BR> {<BR> case 1: ptr = new Dog;<BR> break;<BR> case 2: ptr = new Cat;<BR> break;<BR> case 3: ptr = new Horse;<BR> break;<BR> case 4: ptr = new Pig;<BR> break;<BR> default: ptr = new Mammal;<BR> break;<BR> }<BR> theArray[i] = ptr;<BR> }<BR> for (i=0;i<5;i++)<BR> theArray[i]->Speak();<BR> <BR> <BR> <BR><BR> 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>内容:<BLOCKQUOTE>引用“第1楼”所言<BR><Q>虽然在定义时没有初始化,但随后用new为ptr分配了内存空间,这样做也是可以的,但如果在ptr的定义和new之间就直接使用了ptr,那是会因为没有初始化而出现问题的 而由于程序中new的是对象,所以在这些对象的生命期结束时,会自动调用默认的构析函数来释放该对象占用的内存空间 个人认为,这种作法不是很规范,还是在定义时初始化比较安全。。。</Q></BLOCKQUOTE><BR>谢谢~<BR>有了新问题:似乎并未调用析构函数。<BR>以派生的Dog为例,将声明Dog的代码部分改为:<BR>class Dog : public Mammal<BR>{<BR>public:<BR> Dog() { cout<<"Dog constructor..."<<endl; }<BR> ~Dog() { cout<<"Dog destructor..."<<endl; }<BR> void Speak()const { cout << "Woof!\n"; }<BR>};<BR>试图在屏幕上显示出调用~Dog()时的信息,但结果并没有Dog destructor...的信息。倒是有Dog constructor...(这点可以理解,呵呵)<BR><BR>另外,如果将<BR>virtual ~Mammal() { } <BR>改为<BR>virtual ~Mammal() { cout << "Mammal destructor..." << endl; } <BR>屏幕上也并没有Mammal destructor...的信息提示,但如果在主函数的最后加上<BR>delete ptr;<BR>ptr = 0;<BR>两句后,屏幕上则有了Mammal destructor...的提示信息。尔后在这两句的前面和后面分别加了个“标签”,变成:<BR>cout << "**********************************" << endl;<BR>delete ptr;<BR>ptr = 0;<BR>cout << "**********************************" << endl;<BR>输出结果也显示出~Mammal()的调用是由于这两句引起的(?),但仍不知其所以然,请教。。。<BR><BR>2003-12-23 17:16:51
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -