﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-PeakGao-最新评论</title><link>http://www.cppblog.com/peakgao/commentsrss.aspx</link><description>别读成痞子高</description><language>zh-cn</language><pubDate>Tue, 18 Nov 2008 09:06:00 GMT</pubDate><lastBuildDate>Tue, 18 Nov 2008 09:06:00 GMT</lastBuildDate><generator>cnblogs</generator><item><title>re: 安全的list[未登录]</title><link>http://www.cppblog.com/PeakGao/archive/2008/11/20/66969.html#67377</link><dc:creator>PeakGao</dc:creator><author>PeakGao</author><pubDate>Thu, 20 Nov 2008 05:35:00 GMT</pubDate><guid>http://www.cppblog.com/PeakGao/archive/2008/11/20/66969.html#67377</guid><description><![CDATA[@Jeff Chen<br>你这种其实就是我上面说的这个意思：“再有一种办法，就是对象要移除时，只设置一个需要移除的标志，在下一轮遍历前才真正移除。”，不过你的说法好像有问题哦，遍历时根本不知道是无效的Connection哦，而且不能在遍历的过程中将节点移入到另一个列表，这样会挂的<img src ="http://www.cppblog.com/PeakGao/aggbug/67377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/PeakGao/" target="_blank">PeakGao</a> 2008-11-20 13:35 <a href="http://www.cppblog.com/PeakGao/archive/2008/11/20/66969.html#67377#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 安全的list</title><link>http://www.cppblog.com/PeakGao/archive/2008/11/18/66969.html#67222</link><dc:creator>LOGOS</dc:creator><author>LOGOS</author><pubDate>Tue, 18 Nov 2008 09:06:00 GMT</pubDate><guid>http://www.cppblog.com/PeakGao/archive/2008/11/18/66969.html#67222</guid><description><![CDATA[顶楼上<br>mark it &amp; lazy delete<br><br>这样做在在逻辑上更为完整，相对于作者直接删除对象而言<br><img src ="http://www.cppblog.com/PeakGao/aggbug/67222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/PeakGao/" target="_blank">LOGOS</a> 2008-11-18 17:06 <a href="http://www.cppblog.com/PeakGao/archive/2008/11/18/66969.html#67222#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 安全的list</title><link>http://www.cppblog.com/PeakGao/archive/2008/11/18/66969.html#67176</link><dc:creator>Jeff Chen</dc:creator><author>Jeff Chen</author><pubDate>Tue, 18 Nov 2008 01:29:00 GMT</pubDate><guid>http://www.cppblog.com/PeakGao/archive/2008/11/18/66969.html#67176</guid><description><![CDATA[LZ的情况，我也遇到过，困惑过。当我看完jabberd2的代码后，觉得它的做法比较好。<br><br>方法如下：<br>程序每次先遍历所有的Connection时，无效的Connection将自己移入一个CloseList中。<br>在遍历所有的Connection后，程序接着清理CloseList里的Connection。<br><br>这样做的好处，不会出现LZ这种list“重入”的问题，而且可以灵活处理不需要的对象。<img src ="http://www.cppblog.com/PeakGao/aggbug/67176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/PeakGao/" target="_blank">Jeff Chen</a> 2008-11-18 09:29 <a href="http://www.cppblog.com/PeakGao/archive/2008/11/18/66969.html#67176#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 安全的list[未登录]</title><link>http://www.cppblog.com/PeakGao/archive/2008/11/18/66969.html#67171</link><dc:creator>PeakGao</dc:creator><author>PeakGao</author><pubDate>Tue, 18 Nov 2008 00:58:00 GMT</pubDate><guid>http://www.cppblog.com/PeakGao/archive/2008/11/18/66969.html#67171</guid><description><![CDATA[@不懂<br>理论上是这样，框架彻底的好就没有问题，但是在游戏更新时，经常有生命期结束的对象，这样的对象需要从地图上面移除，就涉及到从列表中erase，而生命期结束是根据update的调用进行检测的。当然可以有另一个办法，就是将检测放到一个时钟里面，而不是在list的遍历过程中，但是这样会需要好多多余的时钟。再有一种办法，就是对象要移除时，只设置一个需要移除的标志，在下一轮遍历前才真正移除。发现越说越复杂了，总之，这个功能就是用于list遍历很复杂时，也能安全的工作。你的这几行，参考我上面的，就一句it=list.erase(it)迭代器不需要临时保存的！！<br>for (std::list&lt;int&gt;::iterator it=list.begin(); it!=list.end();) <br>{ <br>if (条件为真) <br>{ <br>itTmp = it;  // 多余<br>++itTmp; // 多余<br>it = list.erase(it); // 删除当前节点 <br>it = itTmp; // 多余<br>} <br>else <br>++it; <br>} <img src ="http://www.cppblog.com/PeakGao/aggbug/67171.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/PeakGao/" target="_blank">PeakGao</a> 2008-11-18 08:58 <a href="http://www.cppblog.com/PeakGao/archive/2008/11/18/66969.html#67171#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 安全的list</title><link>http://www.cppblog.com/PeakGao/archive/2008/11/18/66969.html#67167</link><dc:creator>不懂</dc:creator><author>不懂</author><pubDate>Tue, 18 Nov 2008 00:38:00 GMT</pubDate><guid>http://www.cppblog.com/PeakGao/archive/2008/11/18/66969.html#67167</guid><description><![CDATA[但是当这个list不是很简单的遍历时，而且删除的时候也不是很显式的在遍历过程中时，就很容易出问题<img src ="http://www.cppblog.com/PeakGao/aggbug/67167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/PeakGao/" target="_blank">不懂</a> 2008-11-18 08:38 <a href="http://www.cppblog.com/PeakGao/archive/2008/11/18/66969.html#67167#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 安全的list</title><link>http://www.cppblog.com/PeakGao/archive/2008/11/18/66969.html#67169</link><dc:creator>不懂</dc:creator><author>不懂</author><pubDate>Tue, 18 Nov 2008 00:38:00 GMT</pubDate><guid>http://www.cppblog.com/PeakGao/archive/2008/11/18/66969.html#67169</guid><description><![CDATA[但是当这个list不是很简单的遍历时，而且删除的时候也不是很显式的在遍历过程中时，就很容易出问题<br><br>如果真有这样的问题，那就是框架有问题<img src ="http://www.cppblog.com/PeakGao/aggbug/67169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/PeakGao/" target="_blank">不懂</a> 2008-11-18 08:38 <a href="http://www.cppblog.com/PeakGao/archive/2008/11/18/66969.html#67169#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 安全的list</title><link>http://www.cppblog.com/PeakGao/archive/2008/11/17/66969.html#67111</link><dc:creator>不懂</dc:creator><author>不懂</author><pubDate>Mon, 17 Nov 2008 06:33:00 GMT</pubDate><guid>http://www.cppblog.com/PeakGao/archive/2008/11/17/66969.html#67111</guid><description><![CDATA[std::list&lt;int&gt;::iterator itTmp;<br><br>for (std::list&lt;int&gt;::iterator it=list.begin(); it!=list.end();) <br>{ <br>if (条件为真) <br>{<br>itTmp = it;<br>++itTmp;<br>it = list.erase(it); // 删除当前节点 <br>it = itTmp;<br>}<br>else <br>++it; <br>} <br><img src ="http://www.cppblog.com/PeakGao/aggbug/67111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/PeakGao/" target="_blank">不懂</a> 2008-11-17 14:33 <a href="http://www.cppblog.com/PeakGao/archive/2008/11/17/66969.html#67111#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 安全的list[未登录]</title><link>http://www.cppblog.com/PeakGao/archive/2008/11/17/66969.html#67089</link><dc:creator>PeakGao</dc:creator><author>PeakGao</author><pubDate>Mon, 17 Nov 2008 02:30:00 GMT</pubDate><guid>http://www.cppblog.com/PeakGao/archive/2008/11/17/66969.html#67089</guid><description><![CDATA[@是什么<br>是这样的，当list的操作很简单时，遍历list几乎没有什么问题，也可以在遍历的时候删除当前节点，如：<br>for (std::list&lt;int&gt;::iterator it=list.begin(); it!=list.end();)<br>{<br>    if (条件为真)<br>       it = list.erase(it); // 删除当前节点<br>    else<br>      ++it;<br>}<br><br>但是当这个list不是很简单的遍历时，而且删除的时候也不是很显式的在遍历过程中时，就很容易出问题，如：<br><br>void MapManager::update(...)<br>{<br>    // typedef std::list&lt;Entity*&gt; DisplayList;<br>    for (DisplayList::iterator it=mDisplayList.begin(); it!=mDisplayList.end();)<br>    {<br>        (*it)-&gt;update(...);<br>    }<br>}<br><br>但是(*it)-&gt;update(...);会调用到另一个模块中去了，可能会这样调用：<br>void Entity::update(...)<br>{<br>    //...<br>    MapManager-&gt;removeEntity(this);<br>}<br><br>而removeEntity会涉及到erase节点：<br>void MapManager::removeEntity(Entity* e)<br>{<br>    mDisplayList.remove(e);<br>}<br><br>如果Entity的update方法中，发现自己的生命期已经结束的话，就会删除自己，这样MapManager::update里面就非法了，这是一个站在砖头上拿掉砖头的问题，必定非法。这个safelist就是为了支持在遍历列表的过程中能安全的erase任何节点。<br><br>可能你们没有碰到该类问题，或者使用list的时候没有那么复杂，所以一时没法去了解。<img src ="http://www.cppblog.com/PeakGao/aggbug/67089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/PeakGao/" target="_blank">PeakGao</a> 2008-11-17 10:30 <a href="http://www.cppblog.com/PeakGao/archive/2008/11/17/66969.html#67089#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>?????</title><link>http://www.cppblog.com/PeakGao/archive/2008/11/16/66969.html#67058</link><dc:creator>是什么</dc:creator><author>是什么</author><pubDate>Sun, 16 Nov 2008 10:45:00 GMT</pubDate><guid>http://www.cppblog.com/PeakGao/archive/2008/11/16/66969.html#67058</guid><description><![CDATA[看不懂 是什么哦<br>电脑程序<br><img src ="http://www.cppblog.com/PeakGao/aggbug/67058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/PeakGao/" target="_blank">是什么</a> 2008-11-16 18:45 <a href="http://www.cppblog.com/PeakGao/archive/2008/11/16/66969.html#67058#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 安全的list</title><link>http://www.cppblog.com/PeakGao/archive/2008/11/16/66969.html#67033</link><dc:creator>winsty</dc:creator><author>winsty</author><pubDate>Sun, 16 Nov 2008 01:40:00 GMT</pubDate><guid>http://www.cppblog.com/PeakGao/archive/2008/11/16/66969.html#67033</guid><description><![CDATA[这个不是线程安全的问题么……<img src ="http://www.cppblog.com/PeakGao/aggbug/67033.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/PeakGao/" target="_blank">winsty</a> 2008-11-16 09:40 <a href="http://www.cppblog.com/PeakGao/archive/2008/11/16/66969.html#67033#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>