📄 subject_34817.htm
字号:
<p>
序号:34817 发表者:悌悌 发表日期:2003-04-02 10:24:42
<br>主题:关于smart pointer的一个问题(在线)
<br>内容:在用smart pointer的时候我发现一个这样的问题,不知道怎么回事?<BR>auto_ptr<int>pFir(new int(11));<BR>auto_ptr<int>pSec;<BR><BR>pSec=auto_ptr<int>(new int(22);<BR>pSec=pFir;<BR>if(pFir.get() == NULL)//此处用来测试pFir是否拥有者发生转移,在DEBUG窗口<BR> exit(0); //看见pFir.owens为0,但该处的判断结果是!= NULL<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>
回复者:xiongli 回复日期:2003-04-02 11:06:07
<br>内容:vc在auto_ptr里面添加一个私有数据成员_Owns,当发生转移过后把_Owns清零.观察Watch窗口就可以看到.
<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-04-02 11:33:18
<br>内容:那就是说不能用pFir.get() == NULL 来判断是否发生拥有者转移?但我在一些资料上看见了是用这句来判断的呀!<BR>还有就是在pSec=pFir之后,为什么还可以用IValue=*pFir来付值,我还是对owens不是很清楚,能解释一下么?多谢了!
<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>回复者:xiongli 回复日期:2003-04-02 11:49:52
<br>内容:但是_Owns是private,也是不能存取的,也就是说也不能用_Owns来判断是不是发生了转移.其实问题的关键是在于到底发生转移没有在auto_ptr语义上面本身是不重要的.<BR>比如这样:<BR>auto_ptr<int>pFir(new int(11));<BR>int *err=pFir.get();<BR>delete err;<BR>这样尽管pFir.get()不是NULL,你还是不能用pFir来存取了.<BR>所以对于到底转移没有,因该是程序员自己在编程的时候决定的.在转移后对_ptr设置为NULL实际上的保护作用不大.因为一是不一定所有的程序员在使用的时候都去检查NULL,二十像上面的例子一样,就算他不是NULL,他也不一定有效.<BR>而auto_ptr主要的功能是防止资源泄漏,在这一点上跟要不要把ptr设置为NULL没有关系
<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 + -