日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

有关内存释放的一些问题

發(fā)布時間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 有关内存释放的一些问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載請注明出處:http://blog.csdn.net/xiaowei_cqu/article/details/7586847

前一天把系統(tǒng)整個重寫了一遍,脈絡(luò)清晰了很多,也終于解決了以前很多崩潰,異常退出的問題。這里小小總結(jié)一下自己遇到的麻煩。

1、內(nèi)存泄露

內(nèi)存泄露是說沒有釋放已經(jīng)不能使用的內(nèi)存,這里一般指堆的內(nèi)存才需要顯示的釋放。比如用malloc,calloc,realloc,new分配的內(nèi)存是在堆上的,需要用free,delete顯示的回收。內(nèi)存泄露最明顯的一是程序很慢,在運行程序時你可以啟動任務(wù)管理器,會看到程序占用的內(nèi)存一直“砰砰砰”的往上漲:


最后直接崩潰,或者你關(guān)閉程序的時候也會異常退出,出現(xiàn)

Debug Assertion Failed!
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

之類的問題。

除了new的對象我們知道要delete。OpenCV中使用cvCreateImage()新建一個IplImage*,以及使用cvCreateMat()新建一個CvMat*,都需要cvReleaseImage() ?cvReleaseMat()顯示的釋放

[cpp]?view plaincopy
  • 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);??
  • 另外一些函數(shù)要用到 CvSeq*來存放結(jié)果(通常這些都要用cvCreateMemStorage()事先分配一塊內(nèi)存CvMemStorage*),都要是釋放掉相應(yīng)的內(nèi)存,這是很難找的。

    比如從二值圖像中尋找輪廓的函數(shù)cvFindContours():

    [cpp]?view plaincopy
  • 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));??
  • //釋放內(nèi)存??
  • cvReleaseMemStorage(&m_storage);??

  • 以及人臉識別中檢測人臉的函數(shù):

    [cpp]?view plaincopy
  • 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)?);??
  • //釋放內(nèi)存??
  • cvReleaseMemStorage(?&faces->storage);??
  • cvReleaseHaarClassifierCascade(?&cascade?);??

  • 注意這里我們可以使用
    cvReleaseMemStorage( &faces->storage);
    來釋放m_storate,也可以使用:
    cvReleaseMemStorage(&m_storage);
    釋放內(nèi)存,這是等效的,但一定不要用兩次!!

    2、一塊內(nèi)存多次釋放

    對應(yīng)沒有釋放內(nèi)存,對應(yīng)就是一個內(nèi)存釋放多次,如同上面的 cvReleaseMemStorage用了兩次。可能報錯的地方:

    [cpp]?view plaincopy
  • __declspec(noinline)??
  • void?__cdecl?_CRT_DEBUGGER_HOOK(int?_Reserved)??
  • {??
  • ????/*?assign?0?to?_debugger_hook_dummy?so?that?the?function?is?not?folded?in?retail?*/??
  • ????(_Reserved);??
  • ????_debugger_hook_dummy?=?0;??
  • }??
  • 或者: Unhandled exception at XXXXXXXXXX in XXX.exe: XXXXXXXXXXX: 堆已損壞。?


    除了上述的MemStorge問題,使用cvQueryFrame()取出CvCapture*每幀圖像,只需在最后釋放CvCapture*,不需要釋放IplImage*

    [cpp]?view plaincopy
  • CvCapture*?pCapture?=?cvCreateCameraCapture(-1);??
  • IplImage*?pFrame=cvQueryFrame(?pCapture?);??
  • cvReleaseCapture(&pCapture);??

  • *這篇是以前寫的,其實還是建議大家用C++接口的OpenCV,內(nèi)存問題很少了~

    總結(jié)

    以上是生活随笔為你收集整理的有关内存释放的一些问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。