首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中使用free命令时出错

在C++中使用free命令时出错
EN

Stack Overflow用户
提问于 2012-03-25 15:11:32
回答 3查看 1.4K关注 0票数 1

我正在尝试编写一个生成N个3x3矩阵的函数(递归加倍算法)。下面的代码产生一个错误。

代码语言:javascript
复制
#define N 4

#include<stdio.h>
#include<stdlib.h>

void CReduce(double*,double*,double*,double*,double*); //Cyclic reducer

int main()
{
    double *a,*b,*c,*d,*x;
    int size = N*sizeof(double);
    int i;

    a = (double*)malloc(size);
    b = (double*)malloc(size);
    c = (double*)malloc(size);
    d = (double*)malloc(size);
    x = (double*)malloc(size);

    //assign vector values-change later
    for(i=0;i<N;i++)
    {
        b[i] = 2.0;
        a[i] = c[i] = -1.0;
        d[i] = 0.0;
    }
    d[N-1] = 1.0;
    a[0] = 1.0;
    c[N-1] = 1.0;

    CReduce(a,b,c,d,x);

    //for(i=0;i<N;i++) printf("%d %lf\n",i,x[i]);

    free(a);
    free(b);
    free(c);
    free(d);
    free(x);

    return 0;
}

void CReduce(double* a,double* b,double* c,double* d,double* x)
{
    double *B,*C;
    int i;

    B = (double*)malloc(N*3*3);
    C = (double*)malloc(N*3*3);

    a[0] = 1.0;
    c[N-1] = 1.0;

    for(i=0;i<N*3*3;i++) B[i]=C[i]=0.0;

    free(B);
    free(C);
}

我还没有完全完成代码,但当我运行代码时,它已经产生了以下错误。

代码语言:javascript
复制
*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x00000000023f4100 ***

有没有人能指点我犯了什么错误?谢谢。

EN

回答 3

Stack Overflow用户

发布于 2012-03-25 15:13:48

这是错误的。

代码语言:javascript
复制
B = malloc(N*3*3);

这是正确的。

代码语言:javascript
复制
B = malloc(sizeof(*B)*N*3*3);

请注意,(double *)是多余的,它只会占用屏幕上的空间。

其他的答案都有很好的建议,他们已经被否决了,但是当N很小的时候,你的程序没有理由使用malloc。除非你知道N会变得越来越大,否则就从你的代码中删除malloc。在这里,越简单越好。

票数 2
EN

Stack Overflow用户

发布于 2012-03-25 15:17:34

我不确定问题出在哪里,但是你真的必须使用动态分配吗?你的N是一个常量,所以你可以写

代码语言:javascript
复制
double a[N];
double b[N];
double c[N];
double d[N];
double x[N];
票数 0
EN

Stack Overflow用户

发布于 2012-03-25 15:24:27

我想补充一个建议。看看你的CReduce函数-

代码语言:javascript
复制
B = (double*)malloc(N*3*3);
C = (double*)malloc(N*3*3);

............

free(B);
free(C);

每当你在同一个函数中看到内存分配和内存释放时,你应该考虑删除动态分配,而使用简单的数组,这将更好地完成相同的工作-

代码语言:javascript
复制
double B[N*3*3];
double C[N*3*3];

但是,根据平台、编译器等的不同,对数组大小有一定的限制。如果声明中的数组长度非常大,其中一些会报告错误。因此,如果你需要一个非常大的数组(比如超过100000个元素),那么动态分配可能是唯一的选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9858504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档