堆内存泄漏和内存越界界访问,该怎么处理

新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
丰衣足食, 积分 794, 距离下一级还需 206 积分
论坛徽章:1
本帖最后由 pprpg 于
23:11 编辑
字符串操作越界, 我想可以通过自定义字符串类型和封装字符串操作函数来处理(不过我觉得如果这样是可行的, 应该有人做过才对)
数组越界不太好处理, 边界检查的代码好像不太好封装.
用工具检查的话, 大多只对堆上的才有效(linux上).
大家是怎么处理这个问题的?
段错误可以core dump, 但有时越界只是修改局部变量.
多个指针指向一块内存, 内存被释放后, 而指针没有清空, 也是越界.
缓冲区溢出, 也是越界.
---------------
我说的封装是类似这样:
typedef struct {
再加上一系列函数,如:
string *StrCpy(string *dest, string *src);
使用时不用考虑字符串长度.
类似c++的std::string.
不过我没有找到std::string在c里的版本, Nginx有这样的结构ngx_str_t, 不过它的函数还是带有长度的.
我的观点是: 人要处理的事很多, 能用代码封装一些细致, 容易出错的知识点就尽量去封装. 只要清楚它们的优缺点, 分清适用场合就可以了.
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
论坛徽章:39
c内存越界的一般处理方式是core dump…………
丰衣足食, 积分 794, 距离下一级还需 206 积分
论坛徽章:1
不止这种情况.
段错误可以core dump, 但有时越界只是修改局部变量, 这种才麻烦.
富足长乐, 积分 7418, 距离下一级还需 582 积分
论坛徽章:0
解决办法:
1,花钱请高级程序员
2,反复检查代码和测试
3,看看能不能用java、c#或者php什么的
丰衣足食, 积分 794, 距离下一级还需 206 积分
论坛徽章:1
本帖最后由 pprpg 于
15:48 编辑
wwwsq 发表于
解决办法:
1,花钱请高级程序员
2,反复检查代码和测试
3,看看能不能用java、c#或者php什么的
我觉得可以用封装什么的方法来试试, 毕竟高级些的语言没有这个问题.
应该有人做过这个事, 只不过我不知道而已.
巨富豪门, 积分 22891, 距离下一级还需 17109 积分
论坛徽章:35
推荐个工具吧,PC_LINT,检查代码,能发现很多代码不安全的地方,对内存越界检查的比较牛逼。内存越界的问题,代码写好才是王道。
丰衣足食, 积分 794, 距离下一级还需 206 积分
论坛徽章:1
我刚才想到, 野指针也是一种越界的方式, 不过它只影响堆.
富足长乐, 积分 7418, 距离下一级还需 582 积分
论坛徽章:0
pprpg 发表于
我觉得可以用封装什么的方法来试试, 毕竟高级些的语言没有这个问题.
应该有人做过这个事, 只不过我 ...
封装好了,就变成java了,也许还是一个劣质的山寨java。这不是正确的方向。
java是什么?java解决了什么问题?
家境小康, 积分 1137, 距离下一级还需 863 积分
论坛徽章:1
为啥内存要越界访问?这个无须处理,直接core dump完事
越处理程序质量越烂
一个合格(非优秀)的C程序,内存越界是完全不能允许的
作为一个C程序员,头脑要清楚的认识到自己写的程序可能访问的每一个字节的地址,以及为什么要访问这个地址,访问这个地址的后果是什么
做不到这一点的话,还是改行去写JAVA吧
丰衣足食, 积分 794, 距离下一级还需 206 积分
论坛徽章:1
safedead 发表于
回复 1# pprpg
为啥内存要越界访问?这个无须处理,直接core dump完事
越处理程序质量越烂
一个合格(非优秀)的C程序,内存越界是完全不能允许的
作为一个C程序员,头脑要清楚的认识到自己写的程序可能访问的每一个字节的地址,以及为什么要访问这个地址,访问这个地址的后果是什么
做不到这一点的话,还是改行去写JAVA吧
缓冲区溢出算不算内存越界?
该不该劝出过这种bug的人改行去写JAVA?
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:22
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处如何解决越界问题和内存溢出【c++吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:295,105贴子:
如何解决越界问题和内存溢出收藏
我的程序是这样的:
#include&iostream&
#include&vector&
using&namespace&
void&main(){
long&int&a[100000];
long&int&g;
&&&&int&k;
long&int&l=1;
long&int&u;
&&&&while(cin&&g&&g!=-1){
&&&&vector&int&&prime();
for(int&i=2;i&33;i++)
if(prime[i])
for(int&j=i;i*j&100000;j++)
prime[i*j]=0;
for(k=2;&k&100000;&k++)
if(prime[k]){&
&&a[l]=k;
&&l++;}
cout&&
for(u=1;u&100000;u++)
if(a[u]==g)
{
&&&&cout&&u&&
}
但是当a[1000000]时会出现内存溢出,我的目的是开辟1000000个空间,而不出现内存溢出问题,那应该怎样运行呢
;上面的代码是可以运行的,单是将a[100000]改为a[1000000]就会出现内存溢出,我的目的是要开辟a[1000000]的空间而不溢出,请问应该如何改正呢&
搜索更多相关主题的帖子:&内存&&&
c++培训课程,美国上市公司&达内&出品c++课程,15年教学经验,总监级c++讲师亲授!!达内首创&先就业后付款&模式.名企项目总监授课,成就&稀缺级&c/c++软件工程师
定义成全局变量
快试试吧,可以对自己使用挽尊卡咯~◆◆
局部变量是在栈里面创建的,vc默认栈大小只有1M,你的a[1000000]就用了4M的空间所以自然溢出了
解决办法要么修改默认栈的大小,或者开辟在堆中
使用全局或者&a&=&new&int[1000000]&都是在堆中开辟空间
在堆上分配最大可以分配多少呢?4G?
有尝试用VirtualAllocEx来分配平坦内存。
登录百度帐号推荐应用c++关于越界访问(内存溢出) - CSDN博客
c++关于越界访问(内存溢出)
越界访问指访问了不是程序申请的内存区域,比如申请了5个字节的char数组,结果读写数据的第六个元素,或者访问了释放后的内存等等。这种错误,大部分情况会抛出AV(access violation)异常,有时不抛出异常, 有时导致软件直接崩溃(类似&Abnormal program termination&);而且抛出异常的地方大多不是越界访问的地方(比如下面的例子),让人摸不着头脑;不抛出异常的时候可能是因为访问了释放后的内存,虽然内存释放了,但还没被系统回收,但时间长了系统也会运行不正常;而且有时在project下的debug版本和release版本下表现的也不一样,比如有时在debug版本下直接导致软件退出,提示:Abnormal
program termination,在release版本下有可能不报异常,但运行一段时间后软件还是没有按照预期运行,比如运行迷失等。以下是一个我经历的越界访问的例子:
std::string tmpS
std::string funCode=...;
char *tmpc=new char[len-48+1];
memset(tmpc,0,len);
tmpStr += funC//AV异常抛出的地方
如果你仅仅查看异常抛出的地方,只是调用std::string的operator+=函数,怎么看也看不出有什么问题! 如果你往前看就会发现我们申请了len-48+1个字节的内存空间, 但是在memeset的时候却填充了len个字节的空间, 多填充了47个字节的空间,而这个越界填充可能就非法填充了tmpStr内部的内存空间,破坏了tmpStr内部的结构,从而造成std::string在函数operator+=的时候抛出异常!
本文已收录于以下专栏:
相关文章推荐
/arong/archive//40598.html
1. 原理分析
经常有些新C++程序员问:C++的类的成员个数是不是有限...
当我们在用C++做底层驱动的时候,经常会遇到内存不足的警告,究其原因,往往是因为内存出现溢出,泄露或者越界等原因。那么他们之间有什么联系吗?
  内存溢出(out of memory)
是指程序在...
与内存泄露相比,C++最令人头痛的问题是内存越界,而内存越界很多情况下是由于悬挂指针引起的。
假设一个指针变量:
使用ptr时,我们除了要判断ptr是否为0以外,还要...
内存分配未成功,却使用了它。
   编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入...
我的学生yang给我来信,说的是C++第11周项目3 - CEmployee类继承自CPerson类中的一个细节:贺老师:  老师,m_szDepartment=new char[...
class Array
   
Array(int c):i(c){ar=new T[c];}
1、什么是数组访问越界?我们通过数组的下标来得到数组内指定索引的元素。这称作对数组的访问。如果一个数组定义为有n个元素,那么,对这n个元素(下标为0 到n-1的元素)的访问都合法,如果对这n个元素之外...
内存泄露:分配了内存而没有释放,逐渐耗尽内存资源,导致系统崩溃
内存越界: 打个比方 就是你有一个500ml的水瓶,然后你倒在瓶里的水大于500ml 那个多余的就会流出来... 
1. 原理分析
...
堆栈溢出 , 简而言之, 就是堆栈满了,还往里面塞东西。
C++中数组作为形参传递给函数时把数组视为指针,并没有将数组的长度信息传递给函数,因而在函数中稍有不慎就会造成数组内存的越界访问。为了避免这个问题,下面根据书上给的内容做了一点总结和说明。
数组形参的...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 内存越界 的文章

 

随机推荐