LINUX.ORG.RU

Как освободить память в С


0

0

есть прога, в ней объявлены массивы массивово, массивы типа unsigneg char, переменные всякие. Но она так глюкаво работает, что постоянно растет её размер в памяти. Может, принудительно надо обнулять массивы массивов после завершения (еще там есть массив данных unsigned char)? Вопрос в том, как это все обнулить?

☆☆

Просьба не пинать, в сях я начинающий, потому мог наглючкать что-то... 

прога такая(это perl-XS, т.е. сишная вставка, но вопрос касается именно массива массивов.):

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

//package Simple Moving Average Image (Smai)

MODULE = Smai            PACKAGE = Smai

SV*
y_pix(unsigned char *pixels, int l, int w, int h, int k)

  PROTOTYPE: DISABLE
  
  INIT:
        int size,n,num,c,cc,ccc,cccc,i,j,r,g,b;
        double y,sum; 
// return hash referense
        HV* hash = newHV();
// return array referense
        AV* array = newAV();
        double data[w], akf[w]; 
        double **ym, **rm, **gm, **bm, **tm, **sym;
  CODE:
        n = 0; num = 0; c = 0; cc=0; ccc=0;
// y-channel
        ym = malloc(h * sizeof(*ym));
	for (i=0; i<h; ++i){
	  ym[i] = malloc ( w * sizeof(**ym));
        }
// r-channel
        rm = malloc(h * sizeof(*rm));
        for (i=0; i<h; ++i){
          rm[i] = malloc ( w * sizeof(**rm));
        }         
// g-channel
        gm = malloc(h * sizeof(*gm));
        for (i=0; i<h; ++i){
          gm[i] = malloc ( w * sizeof(**gm));
        }
// b-channel
        bm = malloc(h * sizeof(*bm));
        for (i=0; i<h; ++i){
          bm[i] = malloc ( w * sizeof(**bm));
        }
// sym matrix
        sym = malloc(h * sizeof(*sym));
        for (i=0; i<h; ++i){
          sym[i] = malloc ( w * sizeof(**sym));
        }
// base-loop for pixels data in hex-format
        while (n < l) { 
          c++;
          if (c == 1) {
            r = (int)pixels[n];
          }
          if (c == 2) {
            g = (int)pixels[n];
          }
          if (c == 3) { cc++;
            b = (int)pixels[n];
            c = 0;
// formula(from science of colorimetry) for calculate y-value from RGB channels of image
            y = r * 0.56 + g * 0.33 + b * 0.11;
            if(cc%w!=0){ 
              ym[num][cc-1]=y;
            } 
            if(cc%w==0){
              ym[num][cc-1]=y;
              num++;
              cc=0; 
            }
          }
          n++;
        }
// calculate Smai
        for (i=k; i<=h-1-k; i++){
          for (j=k; j<=w-1-k; j++){
            int summ=0;
            int ii,jj;
            for (ii=-k; ii<=k; ii++){
              for (jj=-k; jj<=k; jj++){ summ+=ym[i+ii][j+jj]; }
            }
            sym[i][j]=summ/((2*k+1)*(2*k+1));
          }
        }
// add values into unsigned char *pixels 
       int count=0; int e=0;
       for (i=0; i<=h-1; i++){
         for (j=0; j<=w-1; j++){
             pixels[count]=(unsigned char)sym[i][j];
             count++;
             pixels[count]=(unsigned char)sym[i][j];
             count++;
             pixels[count]=(unsigned char)sym[i][j];
             count++;
         }
       }

       av_push(array, newSVnv(ccc));
       hv_store(hash, "arr",3,(SV*)array, 0);
       hv_store(hash, "uns",3, newSVpv ((unsigned char*) pixels, l*sizeof(pixels[0])), 0);
       RETVAL = newRV_noinc((SV*) hash);
  OUTPUT:
       RETVAL 
		

vilfred ☆☆
() автор топика
Ответ на: комментарий от vilfred

вобщем, вопрос отпал, это, оказывается, перловские заморочки с выделением памяти в Perl API... Т.е. я с этим сам походу разберусь ибо там специфических заморочек много слишком.

vilfred ☆☆
() автор топика
Ответ на: комментарий от anonymous

Да еще когда я там учился, на 2-м курсе (1996-й) уже писали под винду на VC++. Сколько тогда народу из-за программирования повылетало! Меня бог миловал, наш поток писал на Borland C (кто хочет - на С++) DOS'овские приложения с Turbo графикой.

anonymous
()
Ответ на: комментарий от anonymous

а я в 1996-м впарил Задорожному броуновское движение на Java :o) Хотя он нам VC++ читал :)

vilfred ☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.