文档章节

内存溢出(heap corruption detected:)

r
 ranjiewen
发布于 2016/11/03 23:51
字数 1088
阅读 4
收藏 0

今天又遇到了上次出现的bug,然后百度了一下,想起来这是内存溢出的毛病,故记录下来!

 

出现的问题就是这样:

heap corruption detected:

after normal block(#xxx) at 0x xxxxxxxx

crt detected that the application wrote to menory after end of heap buffer

 

原因:

这是典型的内存溢出错误,常在内存的delete处发生,而且一般在debug版本中可能出现,release版本中可能并不报错.

出现这个错误的原因一般都是操作new申请的内存溢出,因为在c++中,如果用new分配一段内存,操作的时候改变了该部分的大小,在delete时就会出错.比如说如下部分:

char* p=new char[5]

strcpy(p,"aaaaa");

delete[] p;

这段代码就会出错,因为申请了一个size为5的内存,但是strcpy过去了一个size为6的字符串,因此破坏了这个指针,运行debug版本的时候就会出现先前的错误,但是在release版本中,溢出一个字节的内存很有可能是没有错误的,然后潜在的隐患是肯定存在的,因此,我们在debug遇到这样的错误时候一定要仔细检查对new出的指针的操作.

下面的例子程序有内存溢出的问题:int *pData = newint[n];//不确定大小时,有内存溢出的现象

今天又对求最大子序列的问题研究了一下:

//#include<iostream>
//#include<vector>
//#include<algorithm>
//using namespace std;
//
////常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,
////并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?
//
//// 当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。如果当前得到的和是个负数,
////那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和
//class Solution {
//public:
//    int FindGreatestSumOfSubArray(vector<int> array) {
//        if (array.size() == 0) return 0;
//        int sum1 = array[0];
//        int temp = array[0];
//        for (int i = 1; i<array.size(); i++){
//            //temp为当前数组的和,当求和小于0时,重新选择求和起点
//            //只要有负数,temp就会减少,此时sum1>temp;当减少为负数时,temp重新赋值;直到遇到正数时,又开始求和
//            temp = (temp<0 ? array[i] : array[i] + temp);
//            sum1 = max(sum1, temp);//sum1暂时求得的和,如果后面有比sum1大的求和值,则取而代之
//        }
//        return sum1;
//    }
//};

//C实现

//输入:
//输入有多组数据, 每组测试数据包括两行。
//第一行为一个整数n(0 <= n <= 100000), 当n = 0时, 输入结束。接下去的一行包含n个整数(我们保证所有整数属于[-1000, 1000])。
//输出:
//对应每个测试案例, 需要输出3个整数单独一行, 分别表示连续子向量的最大和、该子向量的第一个元素的下标和最后一个元素的下标。
//若是存在多个子向量, 则输出起始元素下标最小的那个。
//
//#include<stdio.h>
//#include<stdlib.h>
//void main()
//{
//    int curSum, maxSum, start, end,n;
//    int index=0;
//    int *pData;
//    scanf("%d",&n);
//    while (n)
//    {
//        pData = (int*)malloc(sizeof(int)*n);
//        for (size_t i = 0; i < n; i++)
//        {
//            scanf("%d", &pData[i]);
//        }
//        curSum = maxSum = pData[0];
//        start = end = 0;
//        for (size_t i = 1; i < n; i++)
//        {
//            if (curSum<0)
//            {
//                curSum = 0;
//                index=i;//记录此时重新开始的位置
//            }
//            curSum += pData[i];
//            if (curSum>maxSum)
//            {
//                maxSum = curSum;
//                end = i;//结束的位子
//                start = index;//开始的位置
//            }
//        }
//        printf("%d,%d,%d\n",maxSum,start,end);
//        free(pData);
//        scanf("%d",&n);//开始重新循环
//    }
//}

//C++
#include<iostream>
using namespace std;
void main()
{
    int curSum, maxSum, start, end, n;
    int index=0;
    cin >> n;
    while (n)
    {
        int *pData = new int[n];//不确定大小时,有内存溢出的现象
        for (size_t i = 0; i < n; i++)
        {
            cin >> pData[i];
        }
        curSum = maxSum = pData[0];
        start = end = 0;
        for (size_t i = 1; i < n; i++)
        {
            if (curSum<0)
            {
                curSum = 0;
                index = i;//记录此时重新开始的位置
            }
            curSum += pData[i];
            if (curSum>maxSum)
            {
                maxSum = curSum;
                end = i;//结束的位子
                start = index;//开始的位置,当没有经过curSum<0时,index要初始化
            }
        }
        cout << maxSum << "  " << start << "  " << end << endl;
        delete[] pData;
        cin>>n;//开始重新循环
    }
}

 

本文转载自:http://www.cnblogs.com/ranjiewen/p/5259216.html

r
粉丝 1
博文 203
码字总数 28
作品 0
武汉
程序员
私信 提问
微软产品有七成漏洞是内存安全问题

微软安全工程师 Matt Miller 在以色列举行的安全会议 BlueHat 上透露,微软旗下产品过去 12 年修复的所有漏洞,有七成涉及的是内存安全问题。 内存安全是软件和安全工程师使用的术语,描述应...

段段段落
02/14
1K
6
内存写越界导致破环堆结构引起的崩溃问题定位经验

前段时间开发的一个后端C模块上线后,线上出core,初始时,因为訪问压力不大,所以崩溃是上线3天左右出现的。当时用gdb跟进调用堆栈并检查源代码,发现出core位置的代码沒有啥问题。因为当时...

云栖希望。
2017/12/04
0
0
Stack OverFlow 栈溢出 - stack smashing detected

在改造一个otatsgenerator工具时,调试时,发生如下错误: ./app stack smashing detected **: ./app terminated======= Backtrace: =========/lib/tls/i686/cmov/libc.so.6(fortify_fail+0x......

地狱的烈火
2013/07/22
5.9K
0
Metaspace && Heap space的内存溢出

Metaspace && Heap space的内存溢出 note that when the heap space runs out you get However when you run out of PermGen you get However in jdk8 when you run out of Metaspace you......

秋风醉了
2015/11/23
1K
0
qt界面崩溃问题,提示Access violation

最近在用qt开发一个简单的杀毒界面,发现有2%的崩溃率,但是不知道问题出在哪里?windbg分析只有系统的信息。。。 不知道有没有人遇到过,给点建议?感激不尽 EXCEPTION_RECORD: ffffffff -...

和平方舟2909
2015/12/28
993
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
5
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0
一、Django基础

一、web框架分类和wsgiref模块使用介绍 web框架的本质 socket服务端 与 浏览器的通信 socket服务端功能划分: 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... 根据用户访问...

ZeroBit
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部