哪位大神有岛国的网站给我讲解一下c++的内存序

10:59 提问
如何知道自己用c/c++编写的程序运行时会占用多大的内存呢?
就是自己在做一些ACM的题目然后有些题目内存会超,有没有什么方法可以测试自己写的程序到底占用了多大的内存呢?
我用指针实现的树结构,然后标程是用数组实现的,数组占得内存比指针少吗?
按赞数排序
在Windows资源管理器里面可以查看,快捷键是Alt+Ctrl+Delete。在进程里面找到自己编写的程序,后面就有占用的内存
如果数据是非固定大小的,使用数组当然要浪费一些空间。
查看程序占用内存,不同的操作系统都有自己的命令或程序,比如windows的任务管理器。
建议你在实现不同的算法时,估计一下可能的数据量与可能会用到的内存的大小;
优化算法,建立磁盘文件cache,对不需要处理的数据,交换出内存;
你用的操作系统是不是32位的?换成64系统,或许能简单解决你的问题。
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐C++程序内存布局_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C++程序内存布局
&&C++程序内存布局
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
还剩4页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢怎么看一个c++程序内存占用多少以及存在内存哪个部分_c++吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:299,958贴子:
怎么看一个c++程序内存占用多少以及存在内存哪个部分收藏
在内存的哪个部分,这个有难度,起码我不知道..........
登录百度帐号用vc6.0运行编写的C++程序时出现内存不能为read是怎么回事??谢谢各位大侠的帮忙
我写了一段C++程序, 编译时没有出现语法错误, 但是运行时自动跳出0x00401b55指令引用的0x内存, 该内存不能为read, 请各位大侠帮忙看看我这段程序出现什么错误了!!谢谢啦, C++, #include&iostream&void main(){ int i,j,ii,k,jj,iii,n,x, float a[10][10],b[10][10],q=0,bb=0,m[10][10],z,kk,bbb=0; cout&&&---欢迎使用列主元高斯消去法求方程组的根---&&& cout&&&请输入要求的方程组的行和列:&; cin&&n; cout&&&请分别输入各系数的值:&;    //输入各系数------------------------- for(x=1;x&=n;x++) {
for(xx=1;xx&=n;xx++)
cin&&a[x][xx];
} } cout&&&请分别输入等号右边的值:&; for(x=1;x&=n;x++) {
cin&&a[x][n+1];
cout&& } cout&&&这些数字矩阵为:&&& //输出这个系数矩阵和对应的等号右边的值; for(x=1;x&=n;x++) {
for(xx=1;xx&=n+1;xx++)
cout&&a[x][xx];
cout&&&  &;
cout&& } //------------------------------------------------------    //列主元消去法,将矩阵化为上三角阵; for(i=1;i&n;i++) {
for(j=i;j&=n;j++)
bbb=a[j][i];
q=a[j+1][i]&0?a[j+1][i]:-a[j+1][i];
//矩阵换行,将该列绝对值最大对应的行和i行交换;
for(ii=i;i&=n+1;ii++)
bb=a[i][ii];
a[i][ii]=a[j+1][ii];
a[j+1][ii]=
}        if(a[i][i]=0)
//行的初等变换,将该列的其余元素全部化为零;
for(k=i+1;k&=n;k++)
if(a[k][i]=0)
m[k][i]=a[k][i]/a[i][i];
for(jj=1;jj&=n+1;jj++)
a[k][jj]=a[k][jj]-m[k][i]*a[i][jj];
} } //根据变形之后的矩阵,分别算出最后的X的值; b[n][n]=a[n][n+1]/a[n][n]; for(iii=n;iii&0;iii--) {
z+=b[iii][iii]*a[iii-1][iii];
b[iii-1][iii-1]=a[iii-1][n+1]-z/a[iii-1][iii-1]; } for(i=1;i&=n;i++) {
cout&&&X&&&i&&&=&&&b[i][i]&& }}
09-11-13 &
实时曲线的关键是设读数据的时间间隔,建议不要频繁读数据库,周期在30s以上为好.如果是秒级曲线,建议不要通过数据库来读,要直接通过网络通讯获得数据.
请登录后再发表评论!
实时曲线的关键是设读数据的时间间隔,建议不要频繁读数据库,周期在30s以上为好.如果是秒级曲线,建议不要通过数据库来读,要直接通过网络通讯获得数据.
请登录后再发表评论!当前位置:&&编程语言>
c/c++服务器程序内存泄露问题分析及解决
&&&&发布时间:&&
&&&&本文导语:&
对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题,比如 Smart Pointer,Garbage Collection等。Smart Pointer技术比较成熟,STL中已经包含支持Smart Pointer的class,...
对于一个c/来说,是一个常见的也是令人头疼的问题。已经有许多被研究出来以应对这个问题,比如 smart , 等。smart pointer技术比较成熟,中已经包含支持smart pointer的,但是它的使用似乎并不广泛,而且它也不能解决所有的问题;garbage collection技术在中已经比较成熟,但是在c/c++领域的发展并不顺畅,虽然很早就有人在c++中也的支持。现实世界就是这样的,作为一个c/c++程序员,内存泄漏是你心中永远的痛。不过好在现在有许多能够帮助我们验证内存泄漏的,找出发生问题的代码。1.内存泄漏的定义    一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用,,等从堆中分配到一块内存,使用完后,程序必须负责相应的调用或释放该 内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。以下这段演示了堆内存发生泄漏的情形:void MyFunction(int nSize)
 char* p= new char[nSize];
 if( !GetStringFrom( p, nSize ) ){
  MessageBox(“Error”);
 …//using the
}当函数GetStringFrom()返回零的时候,p的就不会被释放。这是一种常见的发生内存泄漏的情形。程序在入口处分配内存,在出口处释放内存,但是c函数可以在任何地方,所以一旦有某个出口处没有释放应该释放的内存,就会发生内存泄漏。  广义的说,内存泄漏不仅仅包含内存的泄漏,还包含系统资源的泄漏( ),比如核心态, ,, 等,从根本上说这些由分配的也消耗内存,如果这些对象发生泄漏最终也会导致内存的泄漏。而且,某些对象消耗的是核心态内存,这些对象严重泄漏时会导致整个操作系统不稳定。所以相比之下,系统资源的泄漏比堆内存的泄漏更为严重。  GDI Object的泄漏是一种常见的泄漏:void CMyView::OnPaint( CDC* pDC )
 CBitmap* pOldB
 bmp.LoadBitmap(IDB_MYBMP);
 pOldBmp = pDC-&SelectObject( &bmp );
 if( Something() ){
 pDC-&SelectObject( pOldBmp );
}当函数Something()返回非零的时候,程序在退出没有把pOldBmp选回中,这会导致pOldBmp指向的对象发生泄 漏。这个程序如果长时间的运行,可能会导致整个花屏。这种问题在Win9x下比较容易暴露出来,因为Win9x的GDI堆比Win2k或的要小很 多。  内存泄漏的发生方式:  以发生的方式来,内存泄漏可以分为4:  1) 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。比如例二,如果Something()函数一直返回True,那么pOldBmp指向的HBITMAP对象总是发生泄漏。 
2) 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。比如例二,如果Something()函数只有在特定环境下才返回 True,那么pOldBmp指向的HBITMAP对象并不总是发生泄漏。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以 测试环境和测试方法对内存泄漏至关重要。  3) 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的中分配内存,在析 构函数中却没有释放该内存,但是因为这个类是一个,所以内存泄漏只会发生一次。另一个例子:char* g_lpszFileName = NULL;
void SetFileName( const char* lpcszFileName )
 if( g_lpszFileName ){
  free( g_lpszFileName );
 g_lpszFileName = strdup( lpcszFileName );
} 如果程序在结束的时候没有释放g_lpszFileName指向的,那么,即使多次调用SetFileName(),总会有一块内存,而且仅有一块内存发生泄漏。   4)隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但 是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。举一 个例子:class Connection
  Connection( SOCKET s);
  ~Connection();
 private:
  SOCKET _
class ConnectionManager
  ConnectionManager(){}
  ~ConnectionManager(){
   list::
   for( it = _connlist.begin(); it != _connlist.end(); ++it ){
    delete (*it);
   _connlist.clear();
  void OnClientConnected( SOCKET s ){
   Connection* p = new Connection(s);
   _connlist.push_back(p);
  void OnClientDisconnected( Connection* pconn ){
   _connlist.remove( pconn );
 private:
  list _
};假设在从端断开后,Server并没有呼叫OnClientDisconnected()函数,那么代表那次的 对象就不会被及时的删除(在Server程序退出的时候,所有Connection对象会在ConnectionManager的析 构函数里被删除)。当不断的有连接建立、断开时隐式内存泄漏就发生了。  从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危 害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到。 2.检测内存泄漏  检测内存泄漏的关键是要能截获住对分配内存和释放内存的函数的调用。截获住这两个函数,我们就能跟踪每一 块内存的,比如,每当成功的分配一块内存后,就把它的指针加入一个的中;每当释放一块内存,再把它的指针从list中删除。这样,当 程序结束的时候,list中剩余的指针就是指向那些没有被释放的内存。这里只是简单的描述了检测内存泄漏的基本原理,详细的算法可以参见Steve Maguire的&& Solid &&。  如果要检测堆内存的泄漏,那么需要截获住 malloc/realloc/free和new/delete就可以了(其实new/delete最终也是用malloc/free的,所以只要截获前 面一组即可)。对于的泄漏,可以采用类似的,截获住相应的分配和释放函数。比如,要检测的泄漏,就需要截获 SysAllocString/SysFreeString;要检测HMENU的泄漏,就需要截获CreateMenu/ DestroyMenu。(有的资源的分配函数有多个,释放函数只有一个,比如,SysAllocStringLen也可以用来分配BSTR,这时就需要 截获多个分配函数)  在平台下,检测内存泄漏的工具的一般有三种, C- 内建的检测功能;外挂式的检测工具,诸如,,BoundsChecker等;利用Windows NT自带的 。这三种工具各有优缺点,MS C-Runtime Library虽然功能上较之外挂式的工具要弱,但是它是的;Performance Monitor虽然无法标示出发生问题的代码,但是它能检测出隐式的内存泄漏的存在,这是其他两类工具无能为力的地方。    内存泄漏是个大而复杂的问题,即使是java和这样有 gabarge collection机制的环境,也存在着泄漏的可能,比如隐式内存泄漏。3.避免
写服务器程序,最怕的就是内存泄露。因为程序经常运行好几个月不停,一点点内存泄露都会导致悲剧的发生。常规来说,首要是避免内存泄露,其次是检查内存泄露。1)不用newc++程序,尽量多用stl,避免用new。我自己写的代码,除了在函数里面有new外,其他地方不会再有任何new出现。这样就把交给stl去做。或许你会说,不用new怎么可能啊?很简单,用::代替,其他对象直接拷贝。除非你的对象很大很大,否则,一点点拷贝耗时,完全可以忽略不计。2)每个重要结构都提供函数给你的每个重要结构都加上一个Info函数,info函数返回一个string,描述当前结构的,如的大小,内存占用的大小。在最顶层,不定时的(或者根据命令输出)各个对象的info结果。这样可以避免隐形的内存泄露,即不是内存泄露,但某个对象保持的大量对象的,导致对象无法被删除;即某个对象内部的map,不断的添加,也在不断的,但在某些特殊情况下,它不会删除。3)stl内存泄露的问题stl几乎没有内存泄露,但它有一个内存,这个cache对小对象的分配很友好。stl的一个麻烦是,它几乎不会释放这些,这样的一个结果是,你看到自己的程序内存占用不断的上涨。其实,上是不用害怕的,因为它涨到一定范围(如,机器只有几百兆可用空间了),就不会涨了。可以通过在运行程序前, glibcxx_force_new=1,来让stl不要进行cache。注意,这个仅仅在() 3.3以后有效。4)等工具
直接,(注意,必须在的当前目录下执行configure,不能另外选一个目录),安装。执行:valgrind --num-callers=20 --leak-check=full --leak-=high ---reachable=yes ---=val.log xxx &,等过了几天后,把它,然后慢慢的看val.log。当你采用了前面3个策略后,valgrind几乎没有啥,反正我从来没有从它这里获得任何有用的过。主要是因为前面几步保证了没有显式的内存泄露,所以,valgrind也就找不出来啥内存泄露了。5)valgrind的工具massifmassif比valgrind好的地方在于,它会告诉你当前内存的分布情况。你可以看到占用了几百兆的程序到底是那些地方占用了内存。执行:valgrind --=massif xxx。一般通过这个都可以看到明显的内存泄露。这个工具很好,俺用它发现了一个十分的情况,这个情况是由的reserve导致的。本来应该reserve返回数据的个数,结果reserve了命中结果的个数。导致偶尔会出现内存占用过500M的情况,但因为没有内存泄露,所以其他几个工具都找不出来,就只有massif提供的堆栈可以发现这个问题。
您可能感兴趣的文章:
本站(WWW.169IT.COM)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。本站(WWW.169IT.COM)站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.转载请注明:文章转载自:[]本文标题:
相关文章推荐:
特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!
(C)9IT.COM,E-mail:www_169it_com#163.com(请将#改为@)}

我要回帖

更多关于 哪位大神有岛国的网站 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信