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

📄 subject_52351.htm

📁 vc
💻 HTM
字号:
<p>
序号:52351 发表者:qihua 发表日期:2003-09-10 11:50:31
<br>主题:一个函数返回字符串值的问题,向方家请教!
<br>内容:vector&lt;string&gt; vs(100,&#34;aa&#34;);<BR>const char* popup_first(void)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;string str = vs[0];<BR>&nbsp;&nbsp;&nbsp;&nbsp;vs.erase(vs.begin());<BR>&nbsp;&nbsp;&nbsp;&nbsp;return str.c_str();<BR>}<BR>请问最后一条return 语句返回的字符串值可用吗?会不会被销毁,然后导致内存访问越界呢?如果不会被销毁,请告诉我原理,谢谢!
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:萧七 回复日期:2003-09-10 11:53:39
<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>
回复者:qihua 回复日期:2003-09-10 12:01:35
<br>内容:首先谢谢你的回答。<BR><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>
回复者:萧七 回复日期:2003-09-10 12:08:11
<br>内容:构造了一个string对象<BR>string str = vs[0];<BR><BR>return str.c_str();<BR>是对str进行操作的了,不关vs的事了。<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>
回复者:adog 回复日期:2003-09-10 12:15:10
<br>内容:可以这么用,str虽说只是一个局部变量,而不是在堆中创建的对象,他是会在函数返回时被消毁,但是你只是返回一个值,而不是<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>
回复者:adog 回复日期:2003-09-10 12:19:52
<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>
回复者:qihua 回复日期:2003-09-10 12:36:44
<br>内容:感谢adog的回答,<BR><BR>但您是否能够说详细一点,return str.c_str()返回的可不是一个值,是一个字符串,如果按照您说的,函数返回时被销毁,那肯定是不能这样用的了。<BR><BR>&nbsp;&nbsp;即:返回值 str.c_str()的指针没有被销毁,<BR>但是&nbsp;&nbsp;str.c_str()指向的内容若被销毁了,岂不是仍然不可用?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:adog 回复日期:2003-09-10 12:40:27
<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>
<font color=red>答案被接受</font><br>回复者:dongfanghong 回复日期:2003-09-10 13:02:26
<br>内容:vector&lt;string&gt; vs(100,&#34;aa&#34;);<BR>const char* popup_first(void)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;string str = vs[0];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //str只是指向VS[0] ,并不分配内存<BR>&nbsp;&nbsp;&nbsp;&nbsp;vs.erase(vs.begin());&nbsp;&nbsp;&nbsp;&nbsp; //将VS的1-99拷贝到0-98,删除99<BR>&nbsp;&nbsp;&nbsp;&nbsp;return str.c_str();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回VS[0]<BR>}<BR><BR>VS 是全局,所以没有问题。<BR><BR>如果是<BR><BR>vector&lt;string&gt; vs(100,&#34;aa&#34;);<BR>const char* popup_first(void)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;string str = vs[0];<BR>&nbsp;&nbsp;&nbsp;&nbsp;vs.clear();<BR>&nbsp;&nbsp;&nbsp;&nbsp;return str.c_str();<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>
回复者:qihua 回复日期:2003-09-10 13:36:11
<br>内容:请问老大 东方红 下面的用法是不是肯定有问题,谢谢!<BR><BR>const char* popup_first(void)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;string str = &#34;ggggggggggg&#34;;<BR>&nbsp;&nbsp;&nbsp;&nbsp;return str.c_str();<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>
回复者:adog 回复日期:2003-09-10 13:58:30
<br>内容:我调试了一下,东方红老兄的分析是对的。改成下面的就不行了:<BR>const char* popup_first(void)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;vector&lt;string&gt; vs(100,&#34;aa&#34;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;string str = vs[0];<BR>&nbsp;&nbsp;&nbsp;&nbsp;vs.erase(vs.begin());<BR>&nbsp;&nbsp;&nbsp;&nbsp;return str.c_str();<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>
回复者:qihua 回复日期:2003-09-10 14:25:58
<br>内容:没有错。<BR><BR>不好意思,其实我真正想问的问题是:下面的用法是否正确<BR>const char* popup_first(void)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;string str = &#34;ggggggggggg&#34;;<BR>&nbsp;&nbsp;&nbsp;&nbsp;return str.c_str();<BR>}<BR>我试了许多次,并且在调用popup_first()后又分配很多内存(我想如果这种用法不对,那重新分配内存应该能够把它冲掉),比如:<BR>int main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;const char *pp =popup();<BR>&nbsp;&nbsp;&nbsp;&nbsp;char *aa=new char[100];<BR>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;&#34;pp=&#34;&lt;&lt;pp&lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<BR>}<BR>可是结果没有出错,难道真的可以这么用吗?是否与const有关呢(把const去掉好像还是对的)?我还是不敢肯定。<BR>&nbsp;&nbsp;&nbsp;&nbsp;
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:adog 回复日期:2003-09-10 14:55:18
<br>内容:葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺萼Press any key to continue<BR>这是我这儿的结果就连我改成这样还是上面的结果:<BR>char* p=&#34;gggggggggg&#34;;<BR>const char* popup_first(void)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;string str=p;<BR>&nbsp;&nbsp;&nbsp;&nbsp;return str.c_str();<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>
回复者:qihua 回复日期:2003-09-10 15:18:18
<br>内容:我刚才是在unix环境试的结果,后来到VC上试了一下,果然于你的一致。<BR><BR>另外,你修改后的代码出错是因为:str 重新分配了内存,并且将p拷贝到str指向的内存中,然后str被销毁,返回的值自然就是乱码了。<BR><BR>现在我终于明白了这个用法是不可以的,非常感谢东方红和adog的回答,adog与我一样,很执著.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:adog 回复日期:2003-09-10 15:29:29
<br>内容:皆大欢喜!<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 + -