当前位置:首页 > 内存 > 正文

内存hook

  • 内存
  • 2024-06-12 02:58:27
  • 595

一、mfc中使用opencv显示图片并释放内存整个系统在前一天被重写,上下文变得更加清晰。之前的很多崩溃和异常退出的问题终于得到了解决。这是我遇到的问题的快速总结。
1.内存泄漏
内存泄漏是指不能再使用的内存没有被释放。这通常是指需要显式释放的堆内存。例如,用malloc、calloc、realloc和new分配的内存都在堆上,必须用free和delete显式回收。最明显的内存泄漏就是程序运行速度非常慢。你可以在程序运行时启动任务管理器,你会发现程序占用的内存“砰砰砰”地不断增加:
最终直接崩溃或者异常退出。关闭程序,就会出现
DebugAssertionFailed!
Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
之类的问题。
除了新对象之外,我们知道我们还需要删除它。在OpenCV中,使用cvCreateImage()创建新的IplImage*和使用cvCreateMat()创建CvMat*需要cvReleaseImage()cvReleaseMat()显示的版本
[cpp]viewplaincopyprint?=cvCreateImage(cvSize((img->width)*scale,(img->height)*scale),8,3);
CvMat*tempMat=cvCreateMat((img->width)*scale,(maxFace->高度)*scale,CV_MAKETYPE(图像->深度,图像->nChannels));
cvReleaseImage(&subImg);
cvReleaseMat(&tempMat);
IplImage*subImg=cvCreateImage(cvSize((img->width)*scale,(img->height)*scale),8,3);
CvMat*tempMat=cvCreateMat((img->width)*scale,(maxFace->高度)*比例,CV_MAKETYPE(图像->深度,图像->nChannels));
cvReleaseImage(&subImg);
cvReleaseMat(&tempMat);其他一些函数使用CvSeq*来存储结果(通常这需要cvCreateMemStorage()提前分配部分内存(CvMemStorage*),并且需要释放相应的内存,很难找到。
例如,用于从二值图像中查找廓的cvFindContours()函数:
[cpp]viewplaincopyprint?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);
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]viewplaincopyprint?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));
//释放内存
cvReleaseMemStorage(&faces->storage);
cvReleaseHaarClassifierCascade(&cascade);
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));
//释放内存
cvReleaseMemStorage(&faces->storage);
cvReleaseHaarClassifierCascade(&cascade);
注意这里我们可以
cvReleaseMemStorage(&faces->storage);
释放m_storeate,还可以使用:
cvReleaseMemStorage(&m_storage);
释放内存,这个是等价的,但是不允许使用两次!!
2.部分内存被多次释放
这意味着内存没有被释放,也就是说一块内存被多次释放,就像上面的cvReleaseMemStorage被使用了两次一样。可能的错误:
[cpp]viewplaincopyprint?__declspec(noinline)
void__cdecl_CRT_DEBUGGER_HOOK(int_Reserved)
{
/*assign0to_debugger_hook_dummysothatthefunctionisnotfoldedinretail*/
(_Reserved);
_debugger_hook_dummy=0;
}
__declspec(noinline)
void__cdecl_CRT_DEBUGGER_HOOK(int_Reserved)
{
/*将0分配给_debugger_hook_dummy,以便该函数不会在零售中折叠*/
(_Reserved);
_debugger_hook_dummy=0;
}或者::XXXXXXXXXXX:堆已损坏。
除了上面的MemStorge问题之外,还可以使用cvQueryFrame()从CvCapture*中取出每一帧。最后只需要释放CvCapture*即可,无需释放IplImage*br/>
[cpp]viewplaincopyprint?CvCapture*pCapture=cvCreateCameraCapture(-1);
IplImage*pFrame=cvQueryFrame(pCapture);
cvReleaseCapture(&pCapture);
CvCapture*pCapture=cvCreateCameraCapture(-1);
IplImage*pFrame=cvQueryFrame(pCapture);
cvReleaseCapture(&pCapture);
*这篇文章其实已经写好了建议使用C++接口的OpenCV。存在一些内存问题


二、内存hook是什么意思?内存挂钩是一种允许您修改程序内存数据而不更改原始程序代码或操作系统资源的技术。内存钩子可以修改程序中的变量、函数调用和其他操作,从而改变程序的行为。这在编写软件或防病毒软件时非常重要。内存挂钩是计算机攻击中常用的技术,它允许攻击者修改正常的程序行为以实现其目标。
内存钩子的实现方式有很多种,包括API钩子、函数钩子、IAThook等。其中,APIhook是最基本的钩子技术,它允许你通过改变API函数的地址来改变程序的行为。APIhook技术可用于补丁、软件破解、软件自动化控制等。函数钩子技术通过拦截函数调用来实现钩子,可用于软件加壳、DLL注入等。IAThook通过改变进程的导入地址表(IAT)中的值来实现钩子。这允许您实现与函数钩子类似的效果。
MemoryHook技术可用于安全与非安全、合法与非法等方面。在安全领域,内存钩子可用于杀毒软件和入侵检测系统,在非安全领域,内存钩子可用于软件破解和自动化测试。同时,记忆钩子还可以应用于政治和军事领域,跟踪和监控目标的行动。请注意,内存挂钩技术也可用于恶意攻击和非法活动,应谨慎使用。