📄 subject_19560.htm
字号:
<p>
序号:19560 发表者:VisualKid 发表日期:2002-10-29 19:43:53
<br>主题:求教:关于子符串与指针之间的问题
<br>内容:class Cperson1<BR>{<BR>private:<BR> char m_name[30];<BR>public:<BR> CPerson2(char *nm){strcpy(m_name,nm);}<BR>}<BR><BR>class CPerson2<BR>{<BR> private:<BR> char *m_name;<BR>public:<BR> Cperson2(char *nm){m_name=nm;}<BR>}<BR><BR>char *name1="Bill";<BR>char *name2="Lili";<BR>char *name=new char[5];<BR><BR>void f1()<BR>{<BR>CPerson1 P1("Mike");<BR><BR>CPerson2 P2("Ray");<BR><BR>char *name3="Jone";<BR>CPerson2 P3(name);<BR><BR>static char name4[]="Johe";<BR>CPerson2 P4(name);<BR><BR>CPerson2 P5(name1);<BR><BR>CPerson2 P6(name2);<BR><BR>char *name5=new char[5];<BR>strcpy(name4,"Mary");<BR>CPerson P5(name5);<BR><BR>strcpy(name,"Blun");<BR>Cperson2 P6(name);<BR>}<BR><BR>所有的CPerosn2的构造函数的参数的得到不同。<BR>我的问题是,这写CPerson2的对象中的m_name可以保存多久,什么时候它所指的子符串无效。<BR><BR>那位高手总结以下<BR>谢谢
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:凯凯 回复日期:2002-10-29 21:44:33
<br>内容:class CPerson2<BR>{<BR>private:<BR> char *m_name;<BR>public:<BR> Cperson2(char *nm){m_name=nm;}<BR>}<BR>这个代码中有一个极大的隐患,Cperson2在构造时,只保存了传进来的指针。但它并不能保证该指针有效。<BR><BR>看下面的程序<BR>{<BR>char *pName = "good";<BR>CPerson2 aPerson(pName);<BR>}<BR>//此处m_name无效<BR><BR>出了大括号范围后,这pName指针被销毁,它所指的内存效,但m_name仍指向无效的内存,这时如果要访问m_name指向的内存就会发生不可预知的错误。<BR><BR>解决的方法是在CPerson2的构造函数中,new一块内存,将传进指针指向的内容COPY到new出来的内存中,m_name指向new出的内存。在CPerson2的析构函数中delete这块内存。<BR><BR>class CPerson2<BR>{<BR>private:<BR> char *m_name;<BR>public:<BR> Cperson2(char *nm){<BR> int length = strlen(nm);<BR> m_name = new char[length+1;<BR> strcpy(m_name,nm);<BR> }<BR> ~Cperson2(){<BR> delete[] m_name;<BR> }<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>
回复者:涂春银 回复日期:2002-10-30 10:26:53
<br>内容:同意楼上的说法,的确CP2的构造函数存在极大的隐患~~~~~~~~~~~~<BR>也就是说m_name没有自己去申请内存,和你的nm一起指向同一个空间,当nm销毁时,m_name就不知道指向那里了~(我是菜鸟,不对的话多多指教);
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:VisualKid 回复日期:2002-10-30 14:08:14
<br>内容:是这样!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -