??xml version="1.0" encoding="utf-8" standalone="yes"?>免费观看久久精彩视频,日日躁夜夜躁狠狠久久AV,久久久久亚洲av无码专区喷水 http://www.shnenglu.com/stdyh/vc java sdkzh-cnThu, 08 May 2025 23:17:03 GMTThu, 08 May 2025 23:17:03 GMT60Memory Leak Detection by Windbghttp://www.shnenglu.com/stdyh/archive/2013/06/19/201152.htmldyhdyhWed, 19 Jun 2013 08:22:00 GMThttp://www.shnenglu.com/stdyh/archive/2013/06/19/201152.htmlhttp://www.shnenglu.com/stdyh/comments/201152.htmlhttp://www.shnenglu.com/stdyh/archive/2013/06/19/201152.html#Feedback0http://www.shnenglu.com/stdyh/comments/commentRss/201152.htmlhttp://www.shnenglu.com/stdyh/services/trackbacks/201152.htmlhttp://www.codeproject.com/Articles/31382/Memory-Leak-Detection-Using-Windbg

Introduction

Memory leak is a time consuming bug often created by C++ developers. Detection of memory leaks is often tedious. Things get worst if the code is not written by you, or if the code base is quite huge.

Though there are tools available in the market that will help you in memory leak detection, most of these tools are not free. I found Windbg as a freeware powerful tool to solve memory leak bugs. At least, we get an idea about the code location which might be suspected to cause memory leaks. COM Interface leaks are out of the scope of this article.

Windbg is a powerful user/kernel space debugger from Microsoft, which can be downloaded and installed from here.

Using Windbg

To start working with Windbg:

  1. Configure the symbol file path to the Microsoft symbol server “SRV*d:\symbols*http://msdl.microsoft.com/download/symbols”.
  2. Add your program EXE/DLL PDB (program database) path to the symbol file path.
  3. You also need to to configure the Operating System's flag to enable user stack trace for the process which has memory leaks. This is simple, and can be done with gflags.exe. Gflags.exe is installed during Windbg's installation. This can also be done through command line, using the command “gflags.exe /i MemoryLeak.exe +ust”. My program name is Test2.exe; hence, for the demo, I will be using Test2.exe rather than MemoryLeak.exe. The snapshot below shows the setting of OS flags for the application Test2.exe.

cmd.JPG

Once we have configured Windbg for the symbol file path, start the process which is leaking memory, and attach Windbg to it. The Attach option in Windbg is available under the File menu, or can be launched using the F6 shortcut. The snapshot below shows the same:

attach.JPG

The !heap command of Windbg is used to display heaps. !heap is well documented in the Windbg help.

I have developed a small program which leaks memory, and will demonstrate further using the same.

Collapse | Copy Code
int _tmain(int argc, _TCHAR* argv[]) {   while(1)       {          AllocateMemory();       }       return 0;  }  void AllocateMemory()  {       int* a = new int[2000];       ZeroMemory(a, 8000);       Sleep(1);  }

The above program leaks an integer array of size 2000*4 bytes.

After attaching Windbg to the process, execute the !heap –s command. -s stands for summary. Below is the output of the !heap -s for the leaking process:

Collapse | Copy Code
0:001> !heap -s NtGlobalFlag enables following debugging aids for new heaps:     validate parameters     stack back traces   Heap     Flags   Reserv  Commit  Virt   Free  List   UCR  Virt  Lock  Fast                      (k)     (k)    (k)     (k) length      blocks cont. heap  -----------------------------------------------------------------------------    00150000 58000062    1024     12     12      1     1     1    0      0   L      00250000 58001062      64     24     24     15     1     1    0      0   L      00260000 58008060      64     12     12     10     1     1    0      0          00330000 58001062   64576  47404  47404     13     4     1    0      0   -----------------------------------------------------------------------------

Let the process execute for some time, and then re-break in to the process, and execute !heap -s again. Shown below is the output of the command:

Collapse | Copy Code
0:001> !heap -s NtGlobalFlag enables following debugging aids for new heaps:    validate parameters    stack back traces    Heap     Flags   Reserv  Commit  Virt   Free  List   UCR  Virt  Lock  Fast                       (k)     (k)    (k)     (k) length      blocks cont. heap     -----------------------------------------------------------------------------     00150000 58000062    1024     12     12      1     1     1    0      0   L       00250000 58001062      64     24     24     15     1     1    0      0   L       00260000 58008060      64     12     12     10     1     1    0      0           00330000 58001062  261184 239484 239484     14     4     1    0      0          -----------------------------------------------------------------------------

Lines marked in bold show the growing heap. The above snapshot shows a heap with the handle 00330000 growing.

Execute “!heap -stat –h 00330000” for the growing heap. This command shows the heap statistics for the growing heap. Shown below is the command's output.

Collapse | Copy Code
0:001> !heap -stat -h 00330000 heap @ 00330000 group-by: TOTSIZE max-display: 20     size     #blocks     total     ( %) (percent of total busy bytes)     1f64 76c6 - e905f58  (99.99)     1800 1 - 1800  (0.00)     824 2 - 1048  (0.00)     238 2 - 470  (0.00)     244 1 - 244  (0.00)     4c 5 - 17c  (0.00)     b0 2 - 160  (0.00)     86 2 - 10c  (0.00)     50 3 - f0  (0.00)     74 2 - e8  (0.00)     38 4 - e0  (0.00)     48 3 - d8  (0.00)     c4 1 - c4  (0.00)     62 2 - c4  (0.00)     be 1 - be  (0.00)     b8 1 - b8  (0.00)     ae 1 - ae  (0.00)     ac 1 - ac  (0.00)     55 2 - aa  (0.00)     a4 1 - a4  (0.00)

The above snapshot shows 0x76c6 blocks of size 1f64 being allocated (marked in bold). Such a huge number of blocks of the same size makes us suspect that these can be leaked blocks. Rest of the block allocations do not have growing block numbers.

The next step is to get the address of these blocks. Use the command !heap -flt s 1f64. This command filters all other blocks of heap and displays the details of blocks having size 1f64.

Shown below is the output for the command:

Collapse | Copy Code
0:001> !heap -flt s 1f64     _HEAP @ 150000     _HEAP @ 250000     _HEAP @ 260000     _HEAP @ 330000       HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state         003360e0 03f0 0000  [07]   003360e8    01f64 - (busy)         00338060 03f0 03f0  [07]   00338068    01f64 - (busy)         00339fe0 03f0 03f0  [07]   00339fe8    01f64 - (busy)         0033bf60 03f0 03f0  [07]   0033bf68    01f64 - (busy)         0033dee0 03f0 03f0  [07]   0033dee8    01f64 - (busy)         01420040 03f0 03f0  [07]   01420048    01f64 - (busy)         01421fc0 03f0 03f0  [07]   01421fc8    01f64 - (busy)         01423f40 03f0 03f0  [07]   01423f48    01f64 - (busy)         01425ec0 03f0 03f0  [07]   01425ec8    01f64 - (busy)         01427e40 03f0 03f0  [07]   01427e48    01f64 - (busy)         01429dc0 03f0 03f0  [07]   01429dc8    01f64 - (busy)         0142bd40 03f0 03f0  [07]   0142bd48    01f64 - (busy)         0142dcc0 03f0 03f0  [07]   0142dcc8    01f64 - (busy)         0142fc40 03f0 03f0  [07]   0142fc48    01f64 - (busy)         01431bc0 03f0 03f0  [07]   01431bc8    01f64 - (busy)         01433b40 03f0 03f0  [07]   01433b48    01f64 - (busy)         01435ac0 03f0 03f0  [07]   01435ac8    01f64 - (busy)         01437a40 03f0 03f0  [07]   01437a48    01f64 - (busy)         014399c0 03f0 03f0  [07]   014399c8    01f64 - (busy)         0143b940 03f0 03f0  [07]   0143b948    01f64 - (busy)         0143d8c0 03f0 03f0  [07]   0143d8c8    01f64 - (busy)         0143f840 03f0 03f0  [07]   0143f848    01f64 - (busy)         014417c0 03f0 03f0  [07]   014417c8    01f64 - (busy)         01443740 03f0 03f0  [07]   01443748    01f64 - (busy)         014456c0 03f0 03f0  [07]   014456c8    01f64 - (busy)         01447640 03f0 03f0  [07]   01447648    01f64 - (busy)         014495c0 03f0 03f0  [07]   014495c8    01f64 - (busy)         0144b540 03f0 03f0  [07]   0144b548    01f64 - (busy)         0144d4c0 03f0 03f0  [07]   0144d4c8    01f64 - (busy)         0144f440 03f0 03f0  [07]   0144f448    01f64 - (busy)         014513c0 03f0 03f0  [07]   014513c8    01f64 - (busy)         01453340 03f0 03f0  [07]   01453348    01f64 - (busy)         014552c0 03f0 03f0  [07]   014552c8    01f64 - (busy)         01457240 03f0 03f0  [07]   01457248    01f64 - (busy)         014591c0 03f0 03f0  [07]   014591c8    01f64 - (busy)         0145b140 03f0 03f0  [07]   0145b148    01f64 - (busy)         0145d0c0 03f0 03f0  [07]   0145d0c8    01f64 - (busy)         0145f040 03f0 03f0  [07]   0145f048    01f64 - (busy)         01460fc0 03f0 03f0  [07]   01460fc8    01f64 - (busy)         01462f40 03f0 03f0  [07]   01462f48    01f64 - (busy)         01464ec0 03f0 03f0  [07]   01464ec8    01f64 - (busy)         01466e40 03f0 03f0  [07]   01466e48    01f64 - (busy)         01468dc0 03f0 03f0  [07]   01468dc8    01f64 - (busy)

Use any UsrPtr column value from the listed output, and then use the the command !heap -p -a UsrPtr to display the call stack for UsrPtr. I have selected 0143d8c8 marked in bold.

Upon execution of !heap -p -a 0143d8c8, we get the call stack shown below:

Collapse | Copy Code
0:001> !heap -p -a 0143d8c8      address 0143d8c8 found in     _HEAP @ 330000       HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state         0143d8c0 03f0 0000  [07]   0143d8c8    01f64 - (busy)         Trace: 0025         7c96d6dc ntdll!RtlDebugAllocateHeap+0x000000e1         7c949d18 ntdll!RtlAllocateHeapSlowly+0x00000044         7c91b298 ntdll!RtlAllocateHeap+0x00000e64         102c103e MSVCR90D!_heap_alloc_base+0x0000005e         102cfd76 MSVCR90D!_heap_alloc_dbg_impl+0x000001f6         102cfb2f MSVCR90D!_nh_malloc_dbg_impl+0x0000001f         102cfadc MSVCR90D!_nh_malloc_dbg+0x0000002c         102db25b MSVCR90D!malloc+0x0000001b         102bd691 MSVCR90D!operator new+0x00000011         102bd71f MSVCR90D!operator new[]+0x0000000f         4113d8 Test2!AllocateMemory+0x00000028         41145c Test2!wmain+0x0000002c         411a08 Test2!__tmainCRTStartup+0x000001a8         41184f Test2!wmainCRTStartup+0x0000000f         7c816fd7 kernel32!BaseProcessStart+0x00000023

The lines marked in bold shows the functions from our code.

Note: Sometimes, it might happen that the “!heap -s” command does not show a growing heap. In that case, use the “!heap -stat -h” command to list all the heaps with their sizes and number of blocks. Spot the growing number of blocks, and then use the “!heap –flt s SIZE” (SIZE = the size of the suspected block) command.



dyh 2013-06-19 16:22 发表评论
]]>
理解 COM 套间 (转自VCKBase)http://www.shnenglu.com/stdyh/archive/2013/06/11/200940.htmldyhdyhTue, 11 Jun 2013 07:24:00 GMThttp://www.shnenglu.com/stdyh/archive/2013/06/11/200940.htmlhttp://www.shnenglu.com/stdyh/comments/200940.htmlhttp://www.shnenglu.com/stdyh/archive/2013/06/11/200940.html#Feedback0http://www.shnenglu.com/stdyh/comments/commentRss/200940.htmlhttp://www.shnenglu.com/stdyh/services/trackbacks/200940.html阅读全文

dyh 2013-06-11 15:24 发表评论
]]>
Bloom filterQ大数据快速排除算?zz)http://www.shnenglu.com/stdyh/archive/2013/01/25/197564.htmldyhdyhFri, 25 Jan 2013 08:15:00 GMThttp://www.shnenglu.com/stdyh/archive/2013/01/25/197564.htmlhttp://www.shnenglu.com/stdyh/comments/197564.htmlhttp://www.shnenglu.com/stdyh/archive/2013/01/25/197564.html#Feedback0http://www.shnenglu.com/stdyh/comments/commentRss/197564.htmlhttp://www.shnenglu.com/stdyh/services/trackbacks/197564.htmlhttp://www.xiuwz.com/site/tech-bloom-filter/

Bloom filter??Howard Bloom?1970 q提出的一U多哈希函数映射的快速查扄法,该算法能够在非常快速的判定某个元素是否在一个集合之外。这U检只会对在集合内的数据错判,而不会对不是?合内的数据进行错判,q样每个请求返回有“在集合内Q可能错误)”?#8220;不在集合内(l对不在集合内)”两种情况。目?a title="Bloom filter" >Bloom filter在分布式pȝ中有着q泛的用,比如说GFS/HDFS/Cassandra/Bigtable/Squid?/p>

实例

Z说明Bloom filter存在的重要意义,举一个实例:

假设要你写一个网l蜘蛛(web crawlerQ。由于网l间的链接错l复杂,蜘蛛在网l间爬行很可能会形成“?#8221;。ؓ了避免Ş?#8220;?#8221;Q就需要知道蜘蛛已l访问过那些URL。给一个URLQ怎样知道蜘蛛是否已经讉Kq呢Q稍微想惻I׃有如下几U方案:

  1. 访问过的URL保存到数据库?/li>
  2. 用HashSet访问过的URL保存h。那只需接近O(1)的代价就可以查到一个URL是否被访问过了?/li>
  3. URLl过MD5或SHA-1{单向哈希后再保存到HashSet或数据库?/li>
  4. Bit-MapҎ。徏立一个BitSetQ将每个URLl过一个哈希函数映到某一位?/li>

Ҏ1~3都是访问过的URL完整保存Q方?则只标记URL的一个映位?/p>

以上Ҏ在数据量较小的情况下都能完美解决问题Q但是当数据量变得非常庞大时问题来了?/p>

Ҏ1的缺点:数据量变得非常庞大后关系型数据库查询的效率会变得很低。而且每来一个URL启动一ơ数据库查询是不是太题大做了?

Ҏ2的缺点:太消耗内存。随着URL的增多,占用的内存会来多。就只?亿个URLQ每个URL只算50个字W,需?GB内存?/p>

Ҏ3Q由于字W串l过MD5处理后的信息摘要长度只有128BitQSHA-1处理后也只有160BitQ因此方?比方?节省了好几倍的内存?/p>

Ҏ4消耗内存是相对较少的,但缺Ҏ单一哈希函数发生冲突的概率太高。还记得数据l构课上学过的Hash表冲H的各种解决Ҏ么?若要降低冲突发生的概率到1%Q就要将BitSet的长度设|ؓURL个数?00倍?/p>

实质上上面的法都忽略了一个重要的隐含条gQ允许小概率的出错,不一定要100%准确Q也是说少量url实际上没有没|络蜘蛛讉KQ而将它们错判为已讉K的代h很小?#8212;—大不了少抓几个网呗?/p>

Bloom Filter的算?/h3>

下面引入本篇的主?#8212;—Bloom filter。其实上面方?的思想已经很接q?a title="Bloom filter" >Bloom filter了。方法四的致命缺Ҏ冲突概率高,Z降低冲突的概念,Bloom filter使用了多个哈希函敎ͼ而不是一?/strong>?/p>

Bloom filter?用的是哈希函数的ҎQ将一个元素映到一?m 长度的阵列上的一个点Q当q个Ҏ 1 Ӟ那么q个元素在集合内Q反之则不在集合内。这个方法的~点是当检的元素量很多时候可能有冲突Q解x法就是?k 个哈?函数对应 k 个点Q如果所有点都是 1 的话Q那么元素在集合内,如果?0 的话Q元素则不再集合内?/p>

Bloom filter 特点

Bloom filter优点是它的插入和查询时间都是常敎ͼ另外它查询元素却不保存元素本w,h良好的安全性。它的缺点也是显而易见的Q?strong>当插入的元素多Q错?#8220;在集合内”的概率就大?/strong>Q另?Bloom filter也不能删除一个元素,因ؓ多个元素哈希的结果可能在 Bloom filter l构中占用的是同一个位Q如果删除了一个比特位Q可能会影响多个元素的检?/p>

其实要做到能够删除一个元素,需要修改下法Q?strong>把bitmap修改成计?/strong>Q这会带来另外一个缺点:内存费?/p>



dyh 2013-01-25 16:15 发表评论
]]>
C++异常ȝhttp://www.shnenglu.com/stdyh/archive/2012/11/30/195828.htmldyhdyhFri, 30 Nov 2012 07:58:00 GMThttp://www.shnenglu.com/stdyh/archive/2012/11/30/195828.htmlhttp://www.shnenglu.com/stdyh/comments/195828.htmlhttp://www.shnenglu.com/stdyh/archive/2012/11/30/195828.html#Feedback0http://www.shnenglu.com/stdyh/comments/commentRss/195828.htmlhttp://www.shnenglu.com/stdyh/services/trackbacks/195828.html1. 抛出的异常对象不应该是指针类?/div>
因ؓ指针指向的对象的删除和析构由谁来处理Q什么时候执行,都是无法定的事情,C++也没有定义,比如堆和栈上的对象的处理方式必然不一?br />
2. 不能昑ּ地把NULL作ؓ异常对象抛出
因ؓthrow(NULL)=tbrow(0)Q因此NULL会被当作整型捕获Q而不是空指针帔RQ这可能与程序员的预期不一?br />
3. 如果一个函数声明时指定了具体的异常cdQ那么它只能抛出指定cd的异?/div>
函数的代码结构如下:q回值类型函数名(形参?throw(cd名表){函数体}
int A() throw(myexception, int)  -- 只能抛出myexception和int两种cd的异?/div>
int A() throw()                  -- 不抛ZQ何异?/div>
int A()                          -- 可以抛出M异常Q也可以不抛出异?/div>
函数原型中的异常声明要与实现中的异常声明一_否则会引起异常冲H。由于异常机制是在运行出现异常时才发挥作用的Q因此如果函数的实现中抛Z没有在其异常声明列表中列出的异常Q编译器也许不能查出来。当抛出一个未在其异常声明列表里的异常cdӞunexpected()函数会被调用Q默认会Dstd::bad_exceptioncd的异常被抛出。如果std::bad_exception不在异常声明列表里,又会Dterminate()被调用,从而导致程序结?br />
4. 异常只能在初始化之后而且E序l束之前抛出
5. throw语句中的表达式本w不能引发新的异?br />
6. I的throw语句只能出现在catch语句块中
I的throw用来捕L异常再抛出,可以实现多个处理E序问异常的传递。然而,如果在catch语句外用Q由于没有捕获到异常Q也没有东西可以再抛出Q这样会DE序以不定的方式l止(q依赖具体的~译?
7. 典型的try-catchl构应该是派生派在最前面Q基cd后,最后是...
8. catch的处理顺序ؓ从上CQ只要找C个匹配的异常cdQ后面的异常处理都被忽略
9. 若异常对象ؓcȝ对象Ӟ应该通过引用来捕?/div>
若不是用引用Q则zcd象L会被截断成ؓ基类对象


dyh 2012-11-30 15:58 发表评论
]]>E序员面试攻略笔?/title><link>http://www.shnenglu.com/stdyh/archive/2012/11/28/195762.html</link><dc:creator>dyh</dc:creator><author>dyh</author><pubDate>Wed, 28 Nov 2012 07:47:00 GMT</pubDate><guid>http://www.shnenglu.com/stdyh/archive/2012/11/28/195762.html</guid><wfw:comment>http://www.shnenglu.com/stdyh/comments/195762.html</wfw:comment><comments>http://www.shnenglu.com/stdyh/archive/2012/11/28/195762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/stdyh/comments/commentRss/195762.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/stdyh/services/trackbacks/195762.html</trackback:ping><description><![CDATA[复习一?lt;E序员面试攻?gt;,q记录一些心?<br /> <br /> <u style="font-size: 14pt; color: red;"><strong>链表:</strong></u><br /> 1. 扑ֈ单链表中倒数Wm个元?br /> ҎQ用两个指针,q两个指针相距m个元素,然后使得两个指针同步前进Q当后一个指针到I时Q前一个指针即为倒数Wm个元?br /> 实现Q?br /> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">elem* FindMToLastElem(elem* head, <span style="color: #0000ff;">int</span> m)<br /> {<br />     elem* current, mbehind;<br />     current = head;<br />     <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> i=0; i<m; i++)<br />     {<br />         <span style="color: #0000FF; ">if</span>(current->next)<br />         {<br />             current = current->next;<br />         }<br />         <span style="color: #0000FF; ">else</span><br />         {<br />             <span style="color: #0000FF; ">return</span> NULL;<br />         }<br />     }<br />     <br />     mbehind = head;<br />     <span style="color: #0000FF; ">while</span>(current->next)<br />     {<br />         current = current->next;<br />         mbehind = mbehind->next;<br />     }<br /> <br />     <span style="color: #0000FF; ">return</span> mbehind;<br /> }</div> <br /> 2. 判断一个链表ؓ循环链表q是非@环链?br /> <img src="http://www.shnenglu.com/images/cppblog_com/stdyh/linktable.PNG" width="674" height="348" alt="" /><br /> ҎQ用快慢指针,快指针每ơ走两步Q慢指针每次C步,若快指针到达NULLQ则为非循环链表Q若快指针超q了慢指针,则ؓ循环链表<br /> 实现Q?br /> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000FF; ">int</span> determin_termination(node* head)<br /> {<br />     node* fast, slow;<br />     <span style="color: #0000FF; ">if</span>(!head || !(head->next))<br />     {<br />         <span style="color: #0000FF; ">return</span> 0;<br />     }<br />     fast = head->next->next;<br />     slow = head->next;<br />     <span style="color: #0000FF; ">while</span>(1)<br />     {<br />         <span style="color: #0000FF; ">if</span>(!fast || !(fast->next))<br />         {<br />             <span style="color: #0000FF; ">return</span> 0;<br />         }<br />         <span style="color: #0000FF; ">else</span> <span style="color: #0000FF; ">if</span>(fast == slow || fast->next == slow)<br />         {<br />             <span style="color: #0000FF; ">return</span> 1;<br />         }<br />         <span style="color: #0000FF; ">else</span><br />         {<br />             fast = fast->next->next;<br />             slow = slow->next;<br />         }<br />     }<br /> }</div> <br /> <u style="font-size: 14pt; color: red;"><strong>树和?<br /> </strong></u>1. 二叉树前序遍历的非递归法<br /> ҎQ用堆?br /> 实现Q?br /> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000FF; ">void</span> PreorderTraversal(node* head)<br /> {<br />     elem* stack;<br />     CreateStack(&stack);<br />     Push(&stack, head);<br />     <br />     node* pNode;<br />     <span style="color: #0000FF; ">while</span>(Pop(&stack, &pNode)<br />     {<br />         <span style="color: #0000FF; ">if</span>(NULL != pNode)<br />         {<br />             printf("%d\n", pNode->value);<br />             Push(&stack, pNode->right);<br />             Push(&stack, pNode->left);<br />         }<br />     }<br />     DeleteStack(&stack);<br /> }</div> <br /> <strong style="color: red; font-size: 14pt;"><u>数组和字W串:</u></strong><br /> 1. 高效删除特定字符<br /> ҎQ每ơ删除字W时不在数组中移动字W串Q而是直接拯C前扫描过的位|中。另外采用数l来减少字符串比较次数?br /> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000FF; ">void</span> RemoveChars(<span style="color: #0000FF; ">char</span> str[], <span style="color: #0000FF; ">char</span> remove[])<br /> {<br />     <span style="color: #008000; ">//</span><span style="color: #008000; "> create an array for remove characters</span><span style="color: #008000; "><br /> </span>    <span style="color: #0000FF; ">char</span> removeArray[256];<br />     <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> i=0; i<256; i++)<br />     {<br />         removeArray[i] = 0;<br />     }<br />     <span style="color: #0000FF; ">int</span> src = 0;<br />     <span style="color: #0000FF; ">while</span>(remove[src])<br />     {<br />         removeArray[remove[src]] = 1;<br />         src++;<br />     }<br />     <span style="color: #0000FF; ">int</span> dest = 0;<br />     src = 0;<br />     <span style="color: #0000FF; ">do</span><br />     {<br />         <span style="color: #0000FF; ">if</span>(!removeArray[remove[src]])<br />         {<br />             str[dest++] = str[src];<br />         }<br />     }<span style="color: #0000FF; ">while</span>(str[src++]);<br />     <br /> }</div> <br />2. 颠倒单词出现的ơ序<br />Do or do not, there is no try. 转换?try. no is there not, do or Do<br />ҎQ先整个字W串颠倒,再将新字W串中的每个单词颠?br /><br />3. ~写字符串和数字怺转换函数<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">int</span> Str2Int(<span style="color: #0000FF; ">char</span>* str)<br />{<br />    <span style="color: #0000FF; ">int</span> num = 0, neg = 1, i = 0;<br />    <span style="color: #0000FF; ">if</span>(str[0] == '-')<br />    {<br />        neg = -1;<br />        i = 1;<br />    }<br />    <br />    <span style="color: #0000FF; ">while</span>(str[i])<br />    {<br />        num = num * 10 + str[i++] - '0';<br />    }<br />    num = num * neg;<br />    <span style="color: #0000FF; ">return</span> num;<br />}<br /><br /><span style="color: #0000FF; ">void</span> Int2Str(<span style="color: #0000FF; ">int</span> num, <span style="color: #0000FF; ">char</span> str[])<br />{<br />    <span style="color: #0000FF; ">int</span> neg = 1;<br />    <span style="color: #0000FF; ">if</span>(num < 0)<br />    {<br />        num *= -1;<br />        neg = -1;<br />    }<br />    <br />    <span style="color: #0000FF; ">int</span> i = 0;<br />    <span style="color: #0000FF; ">do</span><br />    {<br />        str[i++] = num % 10 + '0';<br />        num = num / 10;<br />    }<span style="color: #0000FF; ">while</span>(num)<br /><br />    <span style="color: #0000FF; ">if</span>(neg == -1)<br />    {<br />        str[i++] = '-';<br />    }<br />    str[i] = 0;<br />    <br />    <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> j = 0; j < i/2; j++)<br />    {<br />        str[j] = str[i-1-j];<br />    }<br />    <br />}</div><img src ="http://www.shnenglu.com/stdyh/aggbug/195762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/stdyh/" target="_blank">dyh</a> 2012-11-28 15:47 <a href="http://www.shnenglu.com/stdyh/archive/2012/11/28/195762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]用两个栈实现一个队列——我作ؓ面试官的结http://www.shnenglu.com/stdyh/archive/2012/11/16/195273.htmldyhdyhFri, 16 Nov 2012 08:12:00 GMThttp://www.shnenglu.com/stdyh/archive/2012/11/16/195273.htmlhttp://www.shnenglu.com/stdyh/comments/195273.htmlhttp://www.shnenglu.com/stdyh/archive/2012/11/16/195273.html#Feedback0http://www.shnenglu.com/stdyh/comments/commentRss/195273.htmlhttp://www.shnenglu.com/stdyh/services/trackbacks/195273.html

两年前从|上看到一道面试题Q用两个栈(StackQ实C个队列(QueueQ。觉得不错,q常拿来面试,几年下来Q做此题的应该有几十Z。通过寚w试者的表现和反应,有一些统计和感受Q在此做个小l?/span>

 

?/span>C++描述Q题目大致是q样的:

 

已知下面Stackcd?/span>3个方?/span>Push?/span>Pop?/span> CountQ请?/span>2?/span>Stack实现Queuecȝ入队(Enqueue)出队(Dequeue)Ҏ?/span>

 

class Stack

{

public:

         void Push(int x); // Push an element in stack;

         int Pop();  // Pop an element out of stack;

         int Count() const;     // Return the number of the elements in stack;

};

 

class Queue

{

public:

         void Enqueue(int x);

         int Dequeue();

 

private:

         Stack s1;

         Stack s2;

};

 

q道题应该不难Q比赗编E之》中微Y那些什?#8220;ȝ?#8221;的面试题Q难度上差远了。况且,׃旉关系Q我一般也不要求面试者写代码Q只描述清楚思\卛_。出q道题,主要考察3点:

 

1.       在短旉内,能不能找到解册道题的够清晰的思\Q思维是否敏捷、清晎ͼ?/span>

2.       能不能在单向表述中,清楚地描q自q思\和想法(表述能力是否辑ֈ要求Q?/span>

3.       对于某些具体l节Q能不能考虑刎ͼ是否_l致Q?/span>

 

M上,?/span>10Zؓ例,实际的结果大致是Q?/span>

 

1.       8个h可以扑ֈ解决{案Q?/span>2个h无法扑ֈ{案Q即使进行了必要的提C,曄有位L国MIT深?/span>2q_之后?/span>Google国公司工作q?/span>8个月的兄弟,也没做出来)?/span>

2.       8个找到答案的ZQ?/span>6个找到的Ҏ相同Q?/span>2个h扑ֈ其它变种?/span>

3.       在这8个h中,?/span>1个h可以不经提示Q同时想到大众方法和变种?/span>

 

大多Ch的思\是:始终l护s1作ؓ存储I间Q以s2作ؓ临时~冲区?/span>

入队Ӟ元素压?/span>s1?/span>

出队Ӟ?/span>s1的元素逐个“倒入”Q弹出ƈ压入Q?/span>s2Q将s2的顶元素弹出作ؓ出队元素Q之后再?/span>s2剩下的元素逐个“倒回”s1?/span>

见下面示意图Q?/span>

 

2Stacks1Queue

 

上述思\Q可行性毋庸置疑。但有一个细节是可以优化一下的。即Q在出队Ӟ?/span>s1的元素逐个“倒入”s2Ӟ原在s1栈底的元素,不用“倒入”s2Q即?#8220;?#8221;s1.Count()-1个)Q可直接弹出作ؓ出队元素q回。这样可以减一ơ压栈的操作。约有一半hQ经提示后能意识到此问题?/span>

 

上述思\Q有些变U,如:

入队Ӟ先判?/span>s1是否为空Q如不ؓI,说明所有元素都?/span>s1Q此时将入队元素直接压入s1Q如为空Q要?/span>s2的元素逐个“倒回”s1Q再压入入队元素?/span>

出队Ӟ先判?/span>s2是否为空Q如不ؓI,直接弹出s2的顶元素q出队;如ؓI,?/span>s1的元素逐个“倒入”s2Q把最后一个元素弹出ƈ出队?/span>

有些同时惛_大众Ҏ和变U,应该说头脑还是比较灵光的?/span>

 

相对于第一U方法,变种?/span>s2好像比较“?#8221;Q每ơ出队后Qƈ不将元素“倒回”s1Q如果赶上下ơ还是出队操作,效率会高一些,但下ơ如果是入队操作Q效率不如第一U方法。我有时会让面试者分析比较不同方法的性能。我感觉Q没做深入研IӞQ入队、出队操作随机分布时Q上qCU方法M上时间复杂度和空间复杂度应该相差无几Q无非多个少个判断)?/span>

 

真正性能较高的,其实是另一个变U。即Q?/span>

入队Ӟ元素压?/span>s1?/span>

出队Ӟ判断s2是否为空Q如不ؓI,则直接弹出顶元素Q如为空Q则?/span>s1的元素逐个“倒入”s2Q把最后一个元素弹出ƈ出队?/span>

q个思\Q避免了反复“?#8221;栈,仅在需要时?#8220;?#8221;一ơ。但在实际面试中很少有h说出Q可能是旉较少的缘故吧?/span>

 

以上几个思\乍看没什么问题了Q但其实q是有个l节要考虑的。其实无Z么方法和情况Q都要考虑没有元素可供出队时的处理Q?/span>2个栈都ؓI的时候,出队操作一定会引v异常Q。在实际写代码时Q忽略这些判断或异常处理Q程序会出现问题。所以,能不能考虑到这些细节,也体C个h的素充R?/span>

 

个h感觉Q这道题实有助于我鉴别应聘的h。但对于面试Q毕竟还是要看面试者的l合素质Q一道(或几道)题定生死不可取?/span>



dyh 2012-11-16 16:12 发表评论
]]>
C++ Fragmenthttp://www.shnenglu.com/stdyh/archive/2012/11/05/194562.htmldyhdyhMon, 05 Nov 2012 08:37:00 GMThttp://www.shnenglu.com/stdyh/archive/2012/11/05/194562.htmlhttp://www.shnenglu.com/stdyh/comments/194562.htmlhttp://www.shnenglu.com/stdyh/archive/2012/11/05/194562.html#Feedback0http://www.shnenglu.com/stdyh/comments/commentRss/194562.htmlhttp://www.shnenglu.com/stdyh/services/trackbacks/194562.html1. 模板cȝ定义和实现必L在同一个头文g?br />
2. unary_function和binary_function是stl提供的一元和二元函数对象基类Q子c需实现()操作W,q样的子cd以用在stl法函数中,如sort, partition{?div>   一元函数对象例子如下:
template <typename T> 
class FilterCriterion : public unary_function<T, bool>
{

public:
    bool operator()(const T& val) const
    {
        return (val.size() > 0);
    };

};

FilterCriterion<MyType> f;
partition(vec.begin(), vec.end(), f); //对MyType对象q行分类Qsize必须>0)
   二元函数对象例子如下Q?/div>
template <class T> 
class RankCriterion : public binary_function<T, T, bool>
{
public:
bool operator()(const T& lhs, const T& rhs) const
{
return (lhs.size() > rhs.size());
};
}
RankCriterion<MyType> r;
sort(vec.begin(), vec.begin(), vec.end(), r); // 对MyType对象q行排序(按size大小排序Q?/div>
3. C++处理表达式可以采用先转成逆L兰表辑ּQ然后计?br />http://www.cnblogs.com/adamxx/archive/2006/08/30/703267.html

4. Dll导出cL函数
#ifdef SIMPLEDLL_EXPORT
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif

5. const 成员函数
const 成员函数获得的能力:可以操作帔R对象Q如GetName函数定义为string GetName() const; 那么Const A a; a.GetName();是能~译通过的,若GetName不定义ؓconstQ那么上q调用编译会p|

const成员函数失去的能力:有得必有失,不能修改cȝ数据成员Q不能在函数中调用其他非const的函?/span>

dyh 2012-11-05 16:37 发表评论
]]>[转蝲]Z么会出现LNK2005"W号已定?的链接错? http://www.shnenglu.com/stdyh/archive/2007/05/05/23445.htmldyhdyhSat, 05 May 2007 08:02:00 GMThttp://www.shnenglu.com/stdyh/archive/2007/05/05/23445.htmlhttp://www.shnenglu.com/stdyh/comments/23445.htmlhttp://www.shnenglu.com/stdyh/archive/2007/05/05/23445.html#Feedback0http://www.shnenglu.com/stdyh/comments/commentRss/23445.htmlhttp://www.shnenglu.com/stdyh/services/trackbacks/23445.html阅读全文

dyh 2007-05-05 16:02 发表评论
]]>
C++解析XML -- TinyXmlhttp://www.shnenglu.com/stdyh/archive/2007/05/02/23316.htmldyhdyhWed, 02 May 2007 02:46:00 GMThttp://www.shnenglu.com/stdyh/archive/2007/05/02/23316.htmlhttp://www.shnenglu.com/stdyh/comments/23316.htmlhttp://www.shnenglu.com/stdyh/archive/2007/05/02/23316.html#Feedback0http://www.shnenglu.com/stdyh/comments/commentRss/23316.htmlhttp://www.shnenglu.com/stdyh/services/trackbacks/23316.htmlHomepage: http://www.grinninglizard.com/tinyxml/
downloadQ?a >http://sourceforge.net/projects/tinyxml

用mingw32-make前修改一下makefile文g,改ؓ如下

# DEBUG can be set to YES to include debugging info, or NO otherwise(不是DEBUG)
DEBUG          := NO

# PROFILE can be set to YES to include profiling info, or NO otherwise
PROFILE        := NO

# TINYXML_USE_STL can be used to turn on STL support. NO, then STL
# will not be used. YES will include the STL files.(使用STL,选择的话Q则可以使用std::string)
TINYXML_USE_STL := YES

一?nbsp;     TinyXml的特?

TinyXml是一个基于DOM模型的、非验证的轻量C++解释器?/p>

1.      SAX和DOM

目前XML的解析主要有两大模型QSAX和DOM?/p>

其中SAX是基于事件的Q其基本工作程是分析XML文档Q当发现了一个新的元素时Q生一个对应事Ӟq调用相应的用户处理函数。这U方式占用内存少Q速度快,但用L序相应得会比较复杂?/p>

而DOMQ文档对象模型)Q则是在分析Ӟ一ơ性的整个XML文档q行分析Qƈ在内存中形成对应的树l构Q同Ӟ向用h供一pd的接口来讉K和编辑该树结构。这U方式占用内存大Q速度往往慢于SAXQ但可以l用h供一个面向对象的讉K接口Q对用户更ؓ友好?/p>

 

2.      验证和非验证

对于一个特定的XML文档而言Q其正确性分Z个层ơ。首先是其格式应该符合XML的基本格式要求,比如W一行要有声明,标签的嵌套层ơ必d后一致等{,W合q些要求的文Ӟ是一个合格的XML文gQ称作well-formatted。但除此之外Q一个XML文档因其内容的不同还必须在语义上W合相应的标准,q些标准q应的DTD文g或者Schema文g来定义,W合了这些定义要求的XML文gQ称作valid?/p>

因此Q解析器也分ZU,一U是验证的,即会跟据XML文g中的声明Q用相应的DTD文g对XML文gq行校验Q检查它是否满DTD文g的要求。另一U是忽略DTD文gQ只要基本格式正,可以进行解析?/p>

我所知,验证的解析器通常都是比较重量U的。TinyXml不支持验证,但是体积很小Q用在解析格式较为简单的XML文gQ比如配|文件时Q特别的合适?/p>

 

二?TinyXml的构建和使用
1.      获取

TinyXml首页?a >http://www.grinninglizard.com/tinyxml/index.htmlQ从q里可以扑ֈ最新版本的源代码,目前的版本是 2.4.3 (截至2006.5.17).

2.构徏

TinyXml在构建时可以选择是否支持STLQ选择的话Q则可以使用std::stringQ所以通常应在Windows上,TinyXml的源码包里提供了VC6的工E文Ӟ直接用它可以生成两个静该打开q个选项。态库Q带STL和不带STLQ,非常Ҏ。唯一需要注意的是,默认生成的库是单U程的,如果用在多线E的目中,需要改动一下配|,生成相应的多U程库?/p>

在Unixq_上,TinyXml的源码包里只提供了一个MakefileQ对于典型的LinuxpȝQ或装了gcc和gmake的其他UnixQ这个Makefile_用了Q我在RH9和RHEL4上测试,单的make成功了。需要注意的有以下几点:默认的编译是不支持STL的,可以通过~辑Makefile的TINYXML_USE_STL := NO那一行,把NOҎYES可以支持STL了;q有默认只生成了一个测试程序,没有生成M库,如果要生成静态库的话Q可以用ar命oQ将生成的几个目标文件打包就行了Q如果要生成动态库Q则需要加?fpic参数重新~译?/p>

3.      使用

构徏了相应的库之后,在用了它们的工E中Q只要在q接时把他们q上p了。需要注意的是,如果需要STL支持Q在~译用到了TinyXml的文件时Q需要定义一个宏TIXML_USE_STLQ对gccQ可以用参?DTIXML_USE_STLQ对cl.exeQVCQ,可以使用参数/DTIXML_USE_STLQ如果嫌ȝQ可以直接定义在 tinyxml.h文g里?/p>

 

三?TinyXml的编E模?br>
1.cM间的关系

TinyXml实现的时DOM讉K模型Q因此提供了一pd的类对应XML文g中的各个节点。主要类间的关系如下图所C:

 

 

TiXmlBaseQ其它类的基c,是个抽象c?/p>

TiXmlNodeQ表CZ个节点,包含节点的一般方法,如访问自节点、兄弟节炏V编辑自w、编辑子节点

TiXmlDocumentQ表C整个XML文档Q不对应其中某个特定的节炏V?/p>

TiXmlElementQ表C元素节点,可以包含子节点和TiXmlAttribute

TiXmlCommentQ表C注?/p>

TiXmlDeclarationQ表C声?/p>

TiXmlTextQ表C文本节?/p>

TiXmlUnknownQ表C未知节点,通常是出错了

TiXmlAttributeQ表CZ个元素的属?/p>

下面是一个简单的例子Q?/p>

<?xml version="1.0" encoding="utf-8" ?>

 

 

<!-This is only a sample-->

 

 

<book>

 

 

       <name>TinyXml How To</name>

 

 

       <price unit=”RMB”>20</price>

 

 

       <description>Some words…</description>

 

 

</ book >

 

 

整个文档Q对应TiXmlDocument

book,name,price, descriptionQ都对应TiXmlElement

W一行对应一个TiXmlDeclaration

W二行对应一个TiXmlComment

“TinyXml How To”对应一个TiXmlText

unit则是price的一个TiXmlAttribute

q些cMXML文g中的相应元素都有很好的对应关p,因此怿参照TinyXml的文档,可以很容易的掌握各个Ҏ的用?/p>

 

2.  需要注意的问题

各类之间的{?

 

 

׃各个节点c都从TiXmlNodel承Q在使用时常帔R要将TiXmlNode*cd的指针{换ؓ其派生类的指针,在进行这U{换时Q应该首先用由TiXmlNodecL供的一pd转换函数Q如ToElement(void)Q而不是c++的dynamic_cast

 

查返回?

 

 

׃TinyXml是一个非校验的解析器Q因此当解析一个文件时Q很可能文gq不包含我们预期的某个节点,在这U情况下QTinyXml返回空指针。因此,必须要对q回D行检查,否则很Ҏ出现内存讉K的错误?/p>

 

如何重头建立一个XML文g

 

 

先徏立一个TiXmlDocument对象Q然后,载入某个模板Q或者直接插入一个节点作为根节点Q接着可以像打开一个已有的XML文g那样对它q行操作了?/p>

 

四、ȝ

TinyXml最大的特点是它很,可以很方便的静态连接到E序里。对于像配置文g、简单的数据文gq类文g的解析,它很适合。但是由于它是非验证的,因此需要在E序里做许多查工做,加重了程序编写的负担。因此对于复杂的XML文gQ我觉得最好还是用验证的解析器来处理?/p>



dyh 2007-05-02 10:46 发表评论
]]>[转]C++开源跨q_cd?/title><link>http://www.shnenglu.com/stdyh/archive/2007/04/27/23064.html</link><dc:creator>dyh</dc:creator><author>dyh</author><pubDate>Fri, 27 Apr 2007 12:48:00 GMT</pubDate><guid>http://www.shnenglu.com/stdyh/archive/2007/04/27/23064.html</guid><wfw:comment>http://www.shnenglu.com/stdyh/comments/23064.html</wfw:comment><comments>http://www.shnenglu.com/stdyh/archive/2007/04/27/23064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/stdyh/comments/commentRss/23064.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/stdyh/services/trackbacks/23064.html</trackback:ping><description><![CDATA[     摘要: l典的C++?<br> STLport-------SGI STL库的跨^台可UL版本Q在以前有些~译器离W合 <br> 标准比较q的情况?那时q是有用的,当然目前vc71已经比较接近标准了, <br> 故目前不怎么用它了?<br> Boost---------准标准库Q?功能强大 涉及能想的到的大部分非特别领域的法Q?<br> 有一个大的C++C֌支持 <br> WxWindows-----功能强大的跨q_GUI? Q它的功能和l构都类?MFCQ故原则?<br> 可以通过WxWindows把现有MFCE序UL到非Winq_?<br> Blitz---------高效率的数D函数库 ,你可以订制补充你需要的法 <br> Log4cpp-------日志处理 Q功能类似java中的log4j <br> ACE-----------自适应通讯环境Q?重量U的通讯环境库?<br> Crypto++ -----?解密法? 非常专业的C++ 密码学函式库 <br> CppUnit --- 一?nbsp; <a href='http://www.shnenglu.com/stdyh/archive/2007/04/27/23064.html'>阅读全文</a><img src ="http://www.shnenglu.com/stdyh/aggbug/23064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/stdyh/" target="_blank">dyh</a> 2007-04-27 20:48 <a href="http://www.shnenglu.com/stdyh/archive/2007/04/27/23064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.oqnn.cn" target="_blank">99þþƷۺһ</a>| <a href="http://www.xrvv.cn" target="_blank">޾Ʒ˾þþ</a>| <a href="http://www.tdpqb.cn" target="_blank">ݺɫþۺ</a>| <a href="http://www.bwgwdl.cn" target="_blank">ƷþþþþĻ</a>| <a href="http://www.ssjnet.cn" target="_blank">ɫݺݾþAVۺ</a>| <a href="http://www.jemjc.cn" target="_blank">þþƷרѶ </a>| <a href="http://www.003kd.cn" target="_blank">˾Ʒþþþ7777</a>| <a href="http://www.worldedu.org.cn" target="_blank">Ժձһձþ</a>| <a href="http://www.0813e.cn" target="_blank">þþ91뾫ƷHD</a>| <a href="http://www.e9920.cn" target="_blank">һɫþۺϺݺƪ</a>| <a href="http://www.dush.net.cn" target="_blank">ɫۺϾþþþר</a>| <a href="http://www.snaiye.cn" target="_blank">þһ</a>| <a href="http://www.034867.cn" target="_blank">ƷþþþþĻ </a>| <a href="http://www.xiaominblog.cn" target="_blank">þۺϺݺۺϾþ</a>| <a href="http://www.jtoushou.cn" target="_blank">þۺϺݺɫۺ</a>| <a href="http://www.jhgppeizi.com.cn" target="_blank">ɫþ</a>| <a href="http://www.lalaazg.cn" target="_blank">Ʒþþþav</a>| <a href="http://www.ktqcc.cn" target="_blank">69Ʒþþþ9999APGF</a>| <a href="http://www.tianlaiedu.cn" target="_blank">þþ91Ʒһ</a>| <a href="http://www.lenticular3d.cn" target="_blank">ɫ99þþþø߳ۺӰԺ</a>| <a href="http://www.n-hao.cn" target="_blank">ݺɫþþһ</a>| <a href="http://www.ryzd.com.cn" target="_blank">һaƬþëƬ</a>| <a href="http://www.hsjituan.com.cn" target="_blank">Ʒþþþþ</a>| <a href="http://www.ycjtjedu.cn" target="_blank">þ99ֻƵƷ6</a>| <a href="http://www.cqhthj.com.cn" target="_blank">1000Ʒþþþþþþ</a>| <a href="http://www.juruse.com.cn" target="_blank">Ů˸߳þþýˮ</a>| <a href="http://www.travelgreece.cn" target="_blank">99þó18վ</a>| <a href="http://www.94555.com.cn" target="_blank">www.þ</a>| <a href="http://www.ea52.cn" target="_blank">þþþþҹӰԺ</a>| <a href="http://www.mail-lists.cn" target="_blank">þþƷˬӰ</a>| <a href="http://www.jupucha.com.cn" target="_blank">þùҹaӰԺ</a>| <a href="http://www.shy114.cn" target="_blank">777þµַ</a>| <a href="http://www.qhklmy.cn" target="_blank">vaĻþ</a>| <a href="http://www.86bzpp.cn" target="_blank">޾Ʒtvþþþ</a>| <a href="http://www.hxstone.com.cn" target="_blank">ҹ91þø</a>| <a href="http://www.jsrst-gov.cn" target="_blank">þ99þóѲ</a>| <a href="http://www.662z.cn" target="_blank">Ʒþˬۺ</a>| <a href="http://www.hhh328.cn" target="_blank">þþþӰԺ</a>| <a href="http://www.gawagapu.cn" target="_blank">Ӱһþþþó˾Ʒۺ</a>| <a href="http://www.sdtra.cn" target="_blank">ľƷþþþþò</a>| <a href="http://www.033009.cn" target="_blank">þsmȤ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>