﻿<?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++博客-&lt;font color="#ff8000"&gt;&amp;nbsp&amp;nbsp&amp;nbspC++&amp;nbsp技术中心&lt;/font&gt;-随笔分类-C++ STL</title><link>http://www.cppblog.com/API/category/16115.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 07 May 2020 14:46:00 GMT</lastBuildDate><pubDate>Thu, 07 May 2020 14:46:00 GMT</pubDate><ttl>60</ttl><item><title>golang游戏服务器引擎</title><link>http://www.cppblog.com/API/archive/2020/05/07/217286.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Thu, 07 May 2020 08:04:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2020/05/07/217286.html</guid><wfw:comment>http://www.cppblog.com/API/comments/217286.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2020/05/07/217286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/217286.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/217286.html</trackback:ping><description><![CDATA[<span data-offset-key="51d80-0-0" style="color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif; font-size: 15px; white-space: pre-wrap; background-color: #ffffff;"><span data-text="true">现在go语言比较流行的有leaf,gowold,origin。前两个比较基础，实现集群还需要进行二次的编码设计。origin不一样，只需要通过配置方便快速的集群。</span></span>origin总体设计如go语言设计一样，总是尽可能的提供简洁和易用的模式，快速开发。 能够根据业务需求快速并灵活的制定服务器架构。 利用多核优势，将不同的service配置到不同的node，并能高效的协同工作。 将整个引擎抽象三大对象，node,service,module。通过统一的组合模型管理游戏中各功能模块的关系。&nbsp;<br /><br /><br /><div>origin引擎三大对象关系</div><div>---------------</div><div>* Node:&nbsp; &nbsp;可以认为每一个Node代表着一个origin进程</div><div>* Service:一个独立的服务可以认为是一个大的功能模块，他是Node的子集，创建完成并安装Node对象中。服务可以支持对外部RPC等功能。</div><div>* Module: 这是origin最小对象单元，强烈建议所有的业务模块都划分成各个小的Module组合，origin引擎将监控所有服务与Module运行状态，例如可以监控它们的慢处理和死循环函数。Module可以建立树状关系。Service本身也是Module的类型。<br /><br />更加详细的参照项目地址：<a href="https://github.com/duanhf2012/origin">https://github.com/duanhf2012/origin</a></div><img src ="http://www.cppblog.com/API/aggbug/217286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2020-05-07 16:04 <a href="http://www.cppblog.com/API/archive/2020/05/07/217286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一段用于监测C++内存越界的代码 ， VC++，GCC编译测试通过</title><link>http://www.cppblog.com/API/archive/2014/08/22/208099.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Fri, 22 Aug 2014 08:53:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2014/08/22/208099.html</guid><wfw:comment>http://www.cppblog.com/API/comments/208099.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2014/08/22/208099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/208099.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/208099.html</trackback:ping><description><![CDATA[<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 />-->#ifndef&nbsp;_CHECKMEMOVERFLOW_H_<br /><span style="color: #0000FF; ">#define</span>&nbsp;_CHECKMEMOVERFLOW_H_<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;CHECK_MEM_OVERFLOW<br /><br />#ifdef&nbsp;CHECK_MEM_OVERFLOW<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">操作系统内存分配粒度为页面（4K）</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">#define</span>&nbsp;PAGE_SIZE&nbsp;4096<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;PLATFORM_WIN32<br />#ifdef&nbsp;PLATFORM_WIN32<br />#include&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&lt;windows.h&gt;<br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oooooooo<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />ooooo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;*******<br />*&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />(*)acture&nbsp;memory&nbsp;pages&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;protect&nbsp;page<br /></span><span style="color: #008000; ">*/</span><br />inline&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;(size_t&nbsp;size)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;page_num&nbsp;=&nbsp;(size_t)(size&nbsp;/&nbsp;PAGE_SIZE);<br />&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;offset&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(0&nbsp;!=&nbsp;(size&nbsp;%&nbsp;PAGE_SIZE))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page_num++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset&nbsp;=&nbsp;PAGE_SIZE&nbsp;-&nbsp;size&nbsp;%&nbsp;PAGE_SIZE;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*p&nbsp;=&nbsp;VirtualAlloc(NULL,page_num*PAGE_SIZE+1,MEM_COMMIT,PAGE_READWRITE);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*pchecker&nbsp;=&nbsp;(<span style="color: #0000FF; ">char</span>*)p&nbsp;+&nbsp;page_num*PAGE_SIZE;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;old_value;<br />&nbsp;&nbsp;&nbsp;&nbsp;VirtualProtect(pchecker,PAGE_SIZE,PAGE_NOACCESS,&amp;old_value);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(<span style="color: #0000FF; ">char</span>&nbsp;*)p&nbsp;+&nbsp;offset;<br />}<br />inline&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;delete(<span style="color: #0000FF; ">void</span>&nbsp;*p)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>*&nbsp;address&nbsp;=&nbsp;(<span style="color: #0000FF; ">char</span>&nbsp;*)p&nbsp;-&nbsp;(size_t)(p)&nbsp;%&nbsp;PAGE_SIZE;<br />&nbsp;&nbsp;&nbsp;&nbsp;VirtualFree(address,0,MEM_RELEASE);<br />}<br /><span style="color: #0000FF; ">#else</span><br />#include&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&lt;sys/mman.h&gt;<br />#include&nbsp;&lt;stdio.h&gt;<br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />*&nbsp;*********&nbsp;|oooooooooooooooo<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />ooooo&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;***********<br />*&nbsp;size&nbsp;page&nbsp;|<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />(*)acture&nbsp;memory&nbsp;pages&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;protect&nbsp;page<br /></span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">gcc&nbsp;:&nbsp;connot&nbsp;be&nbsp;inline</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">void</span>&nbsp;*&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;(size_t&nbsp;size)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">calc&nbsp;page&nbsp;num&nbsp;and&nbsp;offset</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;page_num&nbsp;=&nbsp;(<span style="color: #0000FF; ">int</span>)(size&nbsp;/&nbsp;PAGE_SIZE&nbsp;+&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;offset&nbsp;=&nbsp;page_num&nbsp;*&nbsp;PAGE_SIZE&nbsp;-&nbsp;size;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">alloc&nbsp;memory&nbsp;pages</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*p&nbsp;=&nbsp;mmap(NULL,page_num*PAGE_SIZE+2,PROT_READ|PROT_WRITE,MAP_PRIVATE&nbsp;|&nbsp;MAP_ANON,&nbsp;-1,&nbsp;0);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">saved&nbsp;page&nbsp;num</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;size_t*&nbsp;pSize&nbsp;=&nbsp;(size_t*)((<span style="color: #0000FF; ">char</span>*)p+PAGE_SIZE-<span style="color: #0000FF; ">sizeof</span>(size_t));<br />&nbsp;&nbsp;&nbsp;&nbsp;*pSize&nbsp;=&nbsp;page_num+2;<br />&nbsp;&nbsp;&nbsp;&nbsp;mprotect(p,&nbsp;PAGE_SIZE,&nbsp;PROT_NONE);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">set&nbsp;memory&nbsp;overflow&nbsp;protect&nbsp;page</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*pchecker&nbsp;=&nbsp;(<span style="color: #0000FF; ">char</span>*)p&nbsp;+&nbsp;page_num*PAGE_SIZE;<br />&nbsp;&nbsp;&nbsp;&nbsp;mprotect(pchecker,&nbsp;PAGE_SIZE,&nbsp;PROT_NONE);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(<span style="color: #0000FF; ">char</span>&nbsp;*)p&nbsp;+&nbsp;offset;<br />}<br /><span style="color: #0000FF; ">void</span>&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;delete(<span style="color: #0000FF; ">void</span>&nbsp;*p)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">calc&nbsp;acture&nbsp;memory&nbsp;page&nbsp;start&nbsp;address</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>*&nbsp;address&nbsp;=&nbsp;(<span style="color: #0000FF; ">char</span>&nbsp;*)p&nbsp;-&nbsp;(size_t)p&nbsp;%&nbsp;PAGE_SIZE;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;mprotect((<span style="color: #0000FF; ">char</span>*)address-PAGE_SIZE,&nbsp;PAGE_SIZE,&nbsp;PROT_READ);<br />&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;pagenum&nbsp;=&nbsp;(size_t)*((<span style="color: #0000FF; ">char</span>*)address-<span style="color: #0000FF; ">sizeof</span>(size_t));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;munmap((<span style="color: #0000FF; ">char</span>*)address-PAGE_SIZE,&nbsp;pagenum*PAGE_SIZE);<br />}<br /><span style="color: #0000FF; ">#endif</span><br /><br /><br /><span style="color: #0000FF; ">#endif</span><br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;TEST_OVERFLOW</span><span style="color: #008000; "><br /></span>#ifdef&nbsp;TEST_OVERFLOW<br /><br />#include&nbsp;&lt;stdio.h&gt;<br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,<span style="color: #0000FF; ">char</span>&nbsp;*argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("test&nbsp;start<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;a&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">char</span>[12340];<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%c\n",a[12340]);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">程序运行到这里将出现debug中断</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;delete[]&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("test&nbsp;done<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /><span style="color: #0000FF; ">#endif</span><br /><span style="color: #0000FF; ">#endif</span></div><br /><br /><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">原理：</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">1，重载全局new/delete，接管内存申请/释放；</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">2.a，在windows下，页面最小分配单位为4K，调用VirtualAlloc分配内存，并在最后一个页面后面添加一个&#8220;哨兵&#8221;页面，页面属性为NOACCESS，读写该页面均crash；</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">2.b，在linux下，原理同上，但必须在申请的内存前面多申请一个页面保存申请的页面数；</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">注意：</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">只能在C++中使用，windows/mac下测试通过。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">使用方法：<br /></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">只要include这个头文件即可，且内存必须是new出来的，而非malloc的。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">参考：</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">1，http://www.wangchao.net.cn/bbsdetail_65784.html</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">2，http://blog.csdn.net/cjfeii/article/details/9122279</p><img src ="http://www.cppblog.com/API/aggbug/208099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2014-08-22 16:53 <a href="http://www.cppblog.com/API/archive/2014/08/22/208099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>