首页 > malloc申请的内存,被两个指针引用,会报错!

malloc申请的内存,被两个指针引用,会报错!

代码

int *a =(int*) malloc(sizeof(int)*12);
int *b = a+1;

错误

malloc: *** error for object 0x1007000c8: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug

我的理解
应该是a被free之后,b free发现已经free过了!
那该怎么解决呢


使用shared_ptr, share_ptr是一个类, `它使用引用计数, 并且把指针的free操作放在析构函数内部;
,注意是要share_ptr不循环引用`就不会内存泄露, 也不会有double free的问题;


找到问题了

代码如下

    //初始化fushe,全为-1
    char** fushe = (char**)malloc(sizeof(char*)*100);
    for (int i = 0; i < 100 ; ++i) {
        fushe[i] = (char*)malloc(sizeof(char)*100);
    }
    for (int j = 0; j < 100; ++j) {
        memset(fushe[j],-1,100);
    }

    //radio_base指向其中的右下角
    char** radio_base = (char**)malloc(sizeof(char*)*common_size);
    for (int j = 0; j < common_size; ++j) {
        radio_base[j] = fushe[2+must_size+j]+ 2+must_size;
    }

代码就是上面的,后来发现是
char** radio_base = (char**)malloc(sizeof(char*)*common_size);
写成了
char** radio_base = (char**)malloc(sizeof(char)*common_size);

应该属于数组越界的问题!本来应该是common_size*4的字节,因为少了个*,变成了common_size字节。radio_base[j]造成数组越界!但是提示也太奇葩了吧!


如果你贴出来的代码是你全部的代码的话,应该不会报异常的。

int *b = a+1;
这里只是创建一个指针引用一个地址,对你来说是只读的,你又没去写,一般不会异常。但是这种情况一般叫undefined behavior, 异常不异常,是由操作系统的上下文而定的。


你不手动调用free释放内存,编译器是不会帮你释放的啊,所以并不是多次释放冲突引起的问题。应该是某个指针调用free之后另外一个还在继续用,才造成的这个问题。找找哪里释放的这块地址,改到你a,b中最后一次使用的地方再调用。

【热门文章】
【热门文章】