malloc 碰到的诡异问题

代码中先申请了一块内存, 应该不存在内存越界问题,但第二个malloc申请内存是总是core dump/

网上查到, 若之前内存被越界过, 后面的malloc可能就会失败。http://blog.csdn.net/bigapple88/article/details/5693489

但我写的代码应该没有这个问题。


源代码如下:

 1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #include <assert.h>
  5 #include <errno.h>
  6
  7 char* str1;
  8 char* str2;
  9
 10 int* matrix;
 11 int len1;
 12 int len2;
 13
 14 int get_max_len(int x, int y, int* start)
 15 {
 16     int max_len;
 17     int cur_len;
 18     int x0 = -1;
 19
 20     *start = -1;
 21     max_len = 0;
 22     cur_len = 0;
 23
 24     while(x<len1 && y<len2)
 25     {
 26         if (! matrix[x*len1+y])
 27         {
 28             cur_len++;
 29
 30             if (-1 == x0)
 31                 x0 = x;
 32         }
 33         else
 34         {
 35             if (x0 != -1 && x-x0 > max_len)
36             {
 37                 cur_len = x-x0;
 38                 *start = x0;
 39                 x0 = -1;
 40             }
 41         }
 42
 43         if (max_len < cur_len)
 44         {
 45             *start = x0;
 46             max_len = cur_len;
 47         }
 48
 49         ++x, ++y;
 50     }
 51
 52     return max_len;
 53 }
 54
 55
 56 int main(int argc, char* argv[])
 57 {
 58     int i, j;
 59     int cur_len;
 60     int max_len, s;
 61     int start;
 62     extern int errno;
 63     char* sub_str;
 64
 65     if (argc != 3)
 66     {
 67         printf("pls input two strs: \n");
 68         return 0;
 69     }
 70
 71     cur_len = 0;
 72     max_len = 0;
 73     start = 0;
 74     s = -1;
 75     max_len = 0;
 76     int offset = 0;
 77
 78     str1 = argv[1];
 79     str2 = argv[2];
 80
 81     len1 = strlen(str1);
 82     len2 = strlen(str2);
 83
 84     matrix = (int*) malloc(sizeof(int) * (1+len1 * len2));
 85
 86     for (i = 0; i < len1; i++)
 87     {
 88         for (j = 0; j < len2; j++)
 89         {
 90             matrix[i*len1+j] = str1[i] - str2[j];
 91         }
 92     }
 93
 94     for (i = 0; i < len1; i++)
 95     {
 96         cur_len = get_max_len(i, 0, &s);
 97
 98         if (cur_len >  max_len)
 99         {
100             start = s;
101             max_len = cur_len;
102         }
103     }
104
105     for (i = 0; i < len2; i++)
106     {
107         cur_len = get_max_len(0, i, &s);
108
109         if (cur_len >  max_len)
110         {
111             start = s;
112             max_len = cur_len;
113         }
114     }
115
116     free(matrix);
117
118     sub_str = (char*)malloc(max_len+1); // 如果之前的malloc不 +1 在ubuntu上总是提示越界coredump,但在fedora没问题
119     strncpy(sub_str, str1+start, max_len);
120     sub_str[max_len] = '\0';
121
122     printf("max substr is %s\n", sub_str);
123
124     return 0;
125 }
126


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内存泄漏是指在程序执行过程中,动态分配的内存没有被正确释放,导致内存空间被占用并无法再被重复利用的问题。内存泄漏问题的排查是找出造成内存泄漏的代码和地方。 在C++中,我们可以通过重载malloc函数来帮助排查内存泄漏问题malloc函数用于分配内存空间,我们可以自定义一个重载函数,在该函数中添加一些记录和追踪内存分配的操作。 我们可以重载malloc函数来统计分配的内存大小和数量,并将分配的内存记录到一个容器中。可以使用一个全局的哈希表或者链表,每次调用重载的malloc函数时,记录下分配的内存大小和指针地址。当程序结束时,可以输出这个容器中的信息,包括每个分配的内存的大小和对应的指针地址。 通过重载malloc函数,我们可以很容易地定位到哪些地方分配内存后没有及时释放。我们可以在程序中的一些重要位置,比如函数或循环的入口和出口,输出当前的内存分配信息。通过对比入口和出口处的内存分配信息,可以找出内存泄漏的位置。 当然,重载malloc函数仅仅是一种辅助手段,它依赖于程序员的使用和分析。在使用malloc函数时,程序员需要有意识地进行内存的释放操作。只有当程序员规范使用malloc函数,并且及时释放内存时,才能避免内存泄漏问题的发生。 总之,通过重载malloc函数,我们可以在程序运行过程中动态地追踪内存分配的情况,并辅助排查内存泄漏问题。但是,重载malloc函数并不能完全解决内存泄漏问题,程序员仍然需要注意内存的释放操作,以避免内存泄漏的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值