C中的内存泄漏 - 动态数据丢失数据

时间:2011-10-21 16:13:00

标签: c arrays dynamic

我有一个function1,我每次都会分配一个特定字节数的数组。

当我使用printf时,我可以看到我的数据已加载到此阵列上。

function1 (other arguments, CvPoint2D32f* array1)

然后有一个function2,我在其中调用function1并将array1数据分配给另一个变量(array2)。

function2(other stuff, CvPoint2D32f* array2)

当我使用printf时,我发现无法访问我的数据。该程序打印0.000 ..

function2由我的主程序调用,我将数据分配给第三个变量......

我搜索并搜索但找不到有什么问题。

传递指针还不够吗?

帮助,如果我不够具体,请问我:

function1(IplImage* grey, IplImage* image, CvPoint2D32f *array1){

    int array_counter = cvFindContours(grey, storage_color, &colorcontoursizeof(CvContour),
                                 CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
    array1 = (CvPoint2D32f*)malloc(array_counter*sizeof(CvPoint2D32f))
    if (array_counter == 0){
        printf("Error allocating memory or Just a colour missing!!!\n\n\n");
        free(Man);
    }

    cvReleaseMemStorage(&storage_color); // Releasing memory.
    free(Man);

    return array_counter;
}    


int function2(IplImage* image, CvPoint2D32f *array2, other stuff){

    ...other stuff...      

     // Find the contours for the different colors.
    r_counter = function1(image1, image2, array2);

    return 0;
}

编辑=======================================

我在发布之前尝试过这样做,但这是我遇到的问题。

在我在array1中加载关于非类型CvPoint2D32f的数据的行编译时出错。

这就是我在这些行中所做的错误:

array1[cnt].x = (tpt1.x + tpt2.x)/2; 
array1[cnt].y = (tpt1.y + tpt2.y)/2;

第二次编辑=========================

这两个答案都有帮助并且是正确的。谢谢大家!问题已经解决了。 我使用双指针将函数从function1导出到function2,从function2导出到主程序。我使用了一些有用的临时变量。这不那么令人困惑。

2 个答案:

答案 0 :(得分:2)

两种情况:

  // SCENARIO 1: Array allocated outside a function and passed into it
  myfunc (char * buff)
  {
     buff[0] = 'A';
     ...

  main ()
    ...
    char *mybuffer = NULL;
    if ((mybuffer = malloc (100))
      myfunc (mybuffer);
      ...

  // SCENARIO 2: Array allocated inside of a function and passed out from it
  myfunc (char **buff)
  {
     *buff = malloc (100);
     ...

  main ()
    char *mybuffer = NULL;
    myfunc (&mybuffer);
    ...

我认为问题是您可能需要方案2.在“function1()”中尝试“**指向指针”语法

答案 1 :(得分:2)

(试图解释C指针传递语义,请稍等一下)。

C只有pass-by-value,这意味着你不能改变函数的参数。所以在:

function1(IplImage* grey, IplImage* image, CvPoint2D32f *array1){
    ....
    array1 = (CvPoint2D32f*)malloc(array_counter*sizeof(CvPoint2D32f))
    ....
}
r_counter = function1(image1, image2, array2);

您在array1中对function1所做的更改在该函数之外是不可见的(array1是按值传递的,而不是通过引用传递的。)

要解决此问题,请将包含指针的变量传递给函数,以便通过引用传递给它的变量:

function1(IplImage* grey, IplImage* image, CvPoint2D32f **array1){
    ....
    *array1 = (CvPoint2D32f*)malloc(array_counter*sizeof(CvPoint2D32f))
    ....
}
r_counter = function1(image1, image2, &array2);

即。只需添加另一个间接级别。请参阅RFC 1925事实6a(始终可以添加另一级别的间接。)。