2014-01-05 183 views
0

我有內存分配的問題,運行時,下面的while循環我的電腦佔用的RAM不斷增加,我不明白我有什麼分配和如何做到這一點內存分配C++

while(cvWaitKey(1)<0) 
{ 
    img = cvQueryFrame(capture); 
    height = img->height;   
    width = img->width;   
    step = img->widthStep;   
    channels = img->nChannels; 
    gray_arr = (uchar * *)malloc(sizeof(uchar *)*(height + 1)); 
    for(int i=0; i<height; i++) 
     { 
      gray_arr[i] = (uchar *)malloc(sizeof(uchar)*(width + 1)); 
      for(int j=0; j<width; j++) 
       { 
        gray_arr[i][j] = (0.11*data[i*step + j*channels] + 0.56*data[i*step + j*channels + 1] + 0.33*data[i*step + j*channels + 2]); 
       } 
     } 
        for(int j=0; j<width; j++) 
        { 
         sum=0; 
         for(int i=first_pixel; i<last_pixel+1; i++) 
         { 
         value= gray_arr[i][j]; 
         sum = sum + value; 
         } 
         sum=sum/sample_number; 
         store[j]= sum; 
        } 
     for(int i=0; i<width; i++) 
     { 
      intensity_inv[i]=270- store[i]; 
     } 
     graph = cvCreateImage(cvSize(1280,300),IPL_DEPTH_8U,1); 
     cvRectangle(graph, cvPoint(256,0), cvPoint(255,1), CV_RGB(255,255,255),1); 
     for (int i=0; i<width; i++) 
     { 
      cvLine(graph,cvPoint(i,270),cvPoint(i,intensity_inv[i]),CV_RGB(0,0,0)); 
     } 
cvNamedWindow("Sp",CV_WINDOW_AUTOSIZE); 
cvMoveWindow("Sp",0,550); 
cvNamedWindow("Original Image", CV_WINDOW_NORMAL); 
cvMoveWindow("Original Image", 500, 0); 
cvShowImage("Original Image", img); 
cvShowImage("Sp",graph); 
free(gray_arr); 
} 

對不起我的英文不好

感謝

+2

關閉蝙蝠,我看到'height + 1'調用'malloc',但只有一個調用'free'。最終應該對每個'malloc'調用進行一次「免費」調用;如果沒有,你正在泄漏記憶。 –

+2

順便說一句:這看起來像C,而不是C++。 – Matthias

+1

爲什麼使用'malloc'(這是「舊」C)而不是'new'(這是C++)?並請更好地格式化您的代碼(一致的縮進,空行等) – olevegard

回答

3

你調用malloc爲gray_arr陣列:

gray_arr = (uchar * *)malloc(sizeof(uchar *)*(height + 1)); 

,也爲數組中的元素:

gray_arr[i] = (uchar *)malloc(sizeof(uchar)*(width + 1)); 

但是,你只是呼籲free整個陣列的配置。您還需要釋放每個元素的分配。

+0

是的,謝謝,工作!但RAM仍然在慢慢地增加......應該有其他的東西...... – user3163040

+0

你把你的「免費」放在哪裏? – al3xst

+0

在循環結束...我添加這樣的:對(INT I = 0; I <高度;我++) \t \t \t { \t \t \t \t免費(gray_arr [I]); \t \t \t} \t \t \t free(gray_arr); – user3163040