1、C++標准庫的那幾個容器會自動釋放內存么- =還需要手工釋放么,怎麼釋放
有自己的析構函數,不過不要指望如果用了new vector<int>這樣的東西,它們會能知道自己被構造在堆上……
2、java中array使用後需要釋放嗎,如需要請問怎樣釋放?
java中不考慮內存釋放問題,程序員控制不了,即時調用了析構方法也不是立即釋放內存
3、哪種情況下需要釋放變數內存呢?
不用加的,控制項會自動生成析構函數的,當窗體關閉時執行。自己申請的空間才需釋放。
4、CArray需要釋放嗎
CArray本身是不需要釋放的,但如果其內存儲了其它new出來的對象指針,那麼這回些new出來的對象,就答需要你自己手動去釋放了,否則會有內存泄漏!當然,如果它存儲的是些基本數據類型(如int),也就不需要釋放了!
5、memset分配的空間用完以後需要進行釋放嗎? 如果需要釋放,怎麼釋放呢? 求解答
memset是對一塊已有空間進行內容的初始化
如果這塊空間是用malloc分配出來的,當然要釋放內,用free
如果本來就是容字元串數組,那就不用釋放了。
memset(line,0x0,MAX_MSG);
就是對line為頭的這MAX_MSG長度的內存空間賦值0x0
相當於給line這個字元串清空。也就是說字元串里現在是一串字元串結束符'\0'
6、什麼樣的指針需要釋放?該怎麼解決
會不會自動釋放 ctTemp的4個位元組空間?問題2:CDC *dc=GetDC();CBitmap cbTemp;cbTemp.CreateDibComp..(..)在局部函數申請的空間,在堆上創建 得調用Delete那dc這個指針不是申請的,何必釋放呢,難道函數結束不自己釋放------解決方案--------------------------------------------------------delete []crTemp; //這是光清除申請的內存? 對,釋放內存有意義,否則crTemp仍然指向那個地址,而該地址可能已經被別的對象占據------解決方案--------------------------------------------------------第一個問題,delete[]crTemp,只釋放了申請的內存,ctTemp的值還是指向你已經釋放了的內存區的,所以一定要設為NULL。第二個問題,dc這個指針本身是臨時變數,在函數結束時,它本身會被釋放掉,但是它所指向的DC資源卻沒有歸回,相當於在第一個問題中,你沒有delete[]crTemp,而直接crTemp=NULL了。------解決方案--------------------------------------------------------紅豬同學說的很好。這里僅僅做一個補充。在MSDN中說,如果這段代碼在一個CWnd類中,GetDC後是不需要釋放DC的。但作為一個良好的編程習慣。強烈建議,採用紅豬同學的方案。附上MSDN的原話。Unless the device context belongs to a window class, the CWnd::ReleaseDC method must be called to release the context after painting. Since only five common device contexts are available at any given time, failure to release a device context can prevent other applications from accessing a device context.------解決方案--------------------------------------------------------一般來說 new的都要都要釋放 不過如果是mfc的封裝函數申請的,如果它有釋放函數,就直接調用它的釋放函數。------解決方案--------------------------------------------------------寫了很久程序了。雖然一直用。 可是確實不清楚內涵啊從實際上看,當然這個臨時指針變數是會被釋放的,不過習慣有時候比技術不是更重要一些嗎!------解決方案--------------------------------------------------------第一個只把那個new的釋放了就可以,下面的不曉得,學習
7、dataadapter需要釋放資源嗎
C#會自動回收的,你想要釋放也可以的
8、cvqueryframe 需要自己釋放嗎
需要的,刑滿釋放人員恢復常住戶籍的,可以參照如下辦理:一專、事項名稱:刑滿釋屬放人員恢復戶口;二、設定依據:公安部、省公安廳戶籍管理條例。三、申請條件:服刑前為本轄區居民。四、辦理材料:1. 原有《戶口簿》、《居民身份證》2. 釋放證明五、辦理流程:申請、受理、審核、辦結。
9、php變數需要釋放嗎
類裡面的和函數裡面的不需要釋放~
反正代碼執行完都會被終結的,你想要手動釋放的話也沒有問題,畢竟釋放了節約了一些資源~特別對於大項目來說,很有必要的!
10、cvmat型數據需要釋放內存么
關於Opencv 內存泄漏的一些總結
1、內存泄露
內存泄露是說沒有釋放已經不能使用的內存,這里一般指堆的內存才需要顯示的釋放。比如用malloc,calloc,realloc,new分配的內存是在堆上的,需要用free,delete顯示的回收。內存泄露最明顯的一是程序很慢,在運行程序時你可以啟動任務管理器,會看到程序佔用的內存一直「砰砰砰」的往上漲:最後直接崩潰,或者你關閉程序的時候也會異常退出
1)除了new的對象我們知道要delete。
OpenCV中使用cvCreateImage()新建一個IplImage*,以及使用cvCreateMat()新建一個CvMat*,都需要cvReleaseImage() cvReleaseMat()顯示的釋放
[cpp] view plaincopyprint?
IplImage* subImg=cvCreateImage( cvSize((img->width)*scale,(img->height)*scale), 8, 3 );
CvMat *tempMat=cvCreateMat((img->width)*scale,(maxFace->height)*scale,CV_MAKETYPE(image->depth,image->nChannels));
cvReleaseImage(&subImg);
cvReleaseMat(&tempMat);
另外一些函數要用到 CvSeq*來存放結果(通常這些都要用cvCreateMemStorage()事先分配一塊內存CvMemStorage*),都要是釋放掉相應的內存,這是很難找的。
比如從二值圖像中尋找輪廓的函數cvFindContours():
[cpp] view plaincopyprint?
CvMemStorage* m_storage=cvCreateMemStorage(0);
CvSeq * m_contour=0;
cvFindContours( img, m_storage, &m_contour, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
//釋放內存
cvReleaseMemStorage(&m_storage);
以及人臉識別中檢測人臉的函數:
[cpp] view plaincopyprint?
CvMemStorage* m_storage=cvCreateMemStorage(0);
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
CvSeq* faces = cvHaarDetectObjects( img, cascade, m_storage,1.1, 2, 0,cvSize(30, 30) );
//釋放內存
<span style="BACKGROUND-COLOR: #ff99ff">cvReleaseMemStorage( &faces->storage);
( &cascade );</span>
注意這里我們可以使用
cvReleaseMemStorage( &faces->storage);
來釋放m_storate,也可以使用:
cvReleaseMemStorage(&m_storage); // 釋放內存,這是等效的,但一定不要用兩次!!
2、關於cvvImage內存泄露
opencv中的CvvImage類多用在MFC中,因為有Show()這個成員函數,在MFC顯示圖像比IplImage要方便很多。但是同時也有容易疏忽導致內存泄漏的地方。
CvvImage::CopyOf
1
2
void CvvImage::CopyOf(CvvImage& img, intdesired_color);
void CvvImage::CopyOf(IplImage* img, intdesired_color);
從img復制圖像到當前的對象中。
img
要復制的圖像。
desired_color
為復制後圖像的通道數, 復制後圖像的像素深度為8bit。
CopyOf()函數會開辟一個新的空間存放圖像,不會自動釋放。
因此在使用CopyOf()函數後,必須要使用Destroy()函數手動釋放內存
如:
CvvImage cimg;
cimg.CopyOf(img,3); //復制為CvvImage結構
cimg.DrawToHDC(hDC,&rect); // 寫到HDC中,大小為rect
cimg.Destroy();
3、CDC是Windows繪圖設備的基類
其他函數中要使用CDC類,需使用GetDC函數和ReleaseDC函數,實現申請CDC類得指針和釋放CDC類的指針。
CDC的使用:OnDraw(CDC* pDC),因此OnDraw中可以直接使用CDC類編寫代碼。
如:
CDC *pdc = GetDC();
ReleaseDC(pdc);
==================================================================
OpenCV中的內存泄露問題(有些按網上說的效果好像不起作用,內存還是在慢慢長)
1、網上說的 cvLoadImage函數:使用CvvImage類代替。並且使用CvvImage類的Load函數。(我測試後感覺沒有什麼改善)
使用過程大概如下:
//變數定義:
CvvImage pSrcImg;
IplImag *pSrcImgCopy ;//使用IplImag變數做個拷貝。畢竟IplImag 類處理方便。
//獲取圖像:
pSrcImg.Load(str);//str為Cstring類型的圖像文件名
pSrcImgCopy = pSrcImg.GetImage();//拷貝出pSrcImg的圖像數據。
//釋放內存
pSrcImg變數不需要每次釋放,因為每次Load時是覆蓋以前的內存區域。pSrcImgCopy 同樣。
不過在程序結束時要釋放,以免產生內存泄露或者別人以為你忘了。
cvReleaseImage(&pSrcImgCopy );
pSrcImg.Destroy();
不過要正確釋放pSrcImgCopy 時,聲明時必須create下:
pSrcImgCopy = cvCreateImage(cvSize(IMGWIDHT,IMGHEIGHT),IPL_DEPTH_8U, 3);
//IMGWIDHT,IMGHEIGHT為圖像寬和高。
cvCloneImage函數:用cvCopy函數代替。。(我測試後感覺沒有什麼改善)
cvCopy(pSrcImg,pImg,NULL);//代替 pImg = cvCloneImage(pSrcImg);
pImg初始化時必須分配空間,否則上述函數不能執行。
pImg = cvCreateImage(cvSize(IMGWIDHT,IMGHEIGHT),IPL_DEPTH_8U, 3);
2. cvGetCols()、cvGetRows()
......
CvMat *srcMat = cvCreateMat(width, height, CV_8UC3); // 創建一個三通道無符號整數類型的矩陣
cvGetCols(frame,srcMat,0,width);
這里出現內存泄露,因為cvGetCols()、cvGetRows() 是為目標矩陣分配一塊新的數據內存區域,如果目標矩陣的數據區域之前已經分配了內存,則會原始數據內存區域將變成內存碎片,造成內存泄露。解決方法如下:
CvMat *srcMat = cvCreateMat(width, height, CV_8UC3); // 創建一個三通道無符號整數類型的矩陣
cvReleaseData(srcMat); // 先釋放目標矩陣的數據區
cvGetCols(frame,srcMat,0,width);
或者
cvCreateMatHeader(width, height, CV_8UC3);
cvGetCols(frame,srcMat,0,width);
3. IplImag*、CvMat*、CvHistogram* 等結構體指針在使用後要釋放。
IplImage *frame= cvCreateImage(cvSize(width,height),8,1);
CvMat *srcMat = cvCreateMat(width, height, CV_8U);
......
CvHistogram *hist = cvCreateHist(1,&histSize,CV_HIST_ARRAY,ranges,1);
......
cvReleaseMat(&srcMat);
cvReleaseImage(&frame);
cvReleaseHist(&hist);