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

📄 subject_19560.htm

📁 一些关于vc的问答
💻 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>&nbsp;&nbsp;CPerson2(char *nm){strcpy(m_name,nm);}<BR>}<BR><BR>class CPerson2<BR>{<BR> private:<BR>&nbsp;&nbsp;char *m_name;<BR>public:<BR>&nbsp;&nbsp;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>&nbsp;&nbsp;char *m_name;<BR>public:<BR>&nbsp;&nbsp;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>&nbsp;&nbsp;char *m_name;<BR>public:<BR>&nbsp;&nbsp;Cperson2(char *nm){<BR>&nbsp;&nbsp;&nbsp;&nbsp;int length = strlen(nm);<BR>&nbsp;&nbsp;&nbsp;&nbsp;m_name = new char[length+1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;strcpy(m_name,nm);<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;~Cperson2(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;delete[] m_name;<BR>&nbsp;&nbsp;}<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 + -