奇葩问题,寻求帮助

worldy 2014-05-10 11:51:40
一个测试OpenCV的项目,在2008下,一切正常,想将其转到2010下测试,于是,在2010下,使用向导创建了一个工程,然后将支持OpenCV的函数的模块加入到2010项目中,此时,尚未使用OpenCV的支持模块中的函数,一切功能还是2010向导生成的,只是加入模块而已,然后,编译运行,退出,问题来了,报了一堆的内存泄漏,将OpenCV支持模块移除,就不会有泄漏,将一个函数注释掉,也不会有泄漏,函数恢复,又泄漏;OpenCV支持的函数根本就没有运行,为什么会报泄漏?各位高手帮忙分析看看

#include "stdafx.h"
#include <opencv2/opencv.hpp>
//using namespace std;
using namespace cv;

#include "OpenCVSupport.h"

void ShowCvImage(HWND hWnd, const IplImage* pImg)
{
CV_FUNCNAME("ShowCvImage" );
FUN_BEGIN

SIZE size = { 0, 0 };
int channels = 0;
void* dst_ptr = 0;
const int channels0 = 3;
int origin = 0;
CvMat stub, dst, *image;
bool changed_size = false;
CRect rx;

if(!pImg ) EXIT_FUN;
if(!hWnd) EXIT_FUN;

GetClientRect(hWnd,&rx);
HDC hdcX =GetDC(hWnd);

HDC hdc=CreateCompatibleDC(hdcX);
HBITMAP hBmp=CreateCompatibleBitmap(hdcX,rx.Width(),rx.Height());
HGDIOBJ hOldBmp=SelectObject(hdc,hBmp);
HBRUSH hbr=CreateSolidBrush(RGB(255,255,255));
FillRect(hdc,&rx,hbr);
DeleteObject(hbr);

if (hdc)
{
//GetBitmapData
BITMAP bmp;

//GdiFlush();
//HGDIOBJ hBmp = GetCurrentObject(hdc, OBJ_BITMAP );


HBITMAP hBmp =CreateCompatibleBitmap(hdc,1,1);// GetCurrentObject(hdc, OBJ_BITMAP );
if (hBmp == NULL) EXIT_FUN;

if(::GetObject(hBmp,sizeof(bmp), &bmp) == 0)
{
int nErr=GetLastError();
EXIT_FUN;//GetObject(): returns size of object, 0 if error
}

channels = bmp.bmBitsPixel/8;
DeleteObject(hBmp);

if( CV_IS_IMAGE_HDR( pImg )) origin = pImg->origin;

//CV_CALL(image = cvGetMat(pImg, &stub ));
image = cvGetMat(pImg, &stub );
if( size.cx != image->width || size.cy != image->height || channels != channels0 )
{
changed_size = true;

uchar buffer[sizeof(BITMAPINFO) + 255*sizeof(RGBQUAD)];
BITMAPINFO* pInfo = (BITMAPINFO*)buffer;

BOOL bDeleteObj = DeleteObject(GetCurrentObject(hdc, OBJ_BITMAP));
CV_Assert( FALSE != bDeleteObj );

//size.cx = image->width;
//size.cy = image->height;
channels = channels0;

FillBitmapInfo(pInfo, image->width,image->height, channels*8, 1 );
//SelectObject(hdc, CreateDIBSection( hdc,binfo, DIB_RGB_COLORS, &dst_ptr, 0, 0));
HBITMAP hDibBmp=CreateDIBSection( hdc,pInfo, DIB_RGB_COLORS, &dst_ptr, 0, 0);

cvInitMatHeader(&dst, image->height,image->width, CV_8UC3, dst_ptr, (image->width * channels + 3) & -4 );
cvConvertImage(image, &dst, origin == 0 ? CV_CVTIMG_FLIP : 0 );

// Image stretching to fit the window
//RECT rect;
//GetClientRect(hWnd, &rect);
SetStretchBltMode(hdc,HALFTONE);
//StretchDIBits(hdc, 0, 0, rect.right, rect.bottom, 0, 0, image->width, image->height, dst_ptr, &binfo, DIB_RGB_COLORS, SRCCOPY );
SetDIBitsToDevice(hdc,0,0,rx.Width(),image->height/*rx.Height()*/,0,0,0,image->height-1, dst_ptr,pInfo, DIB_RGB_COLORS);
//SetDIBits(hdc,0,0,image->height,dst_ptr, &binfo, DIB_RGB_COLORS);
DeleteObject(hDibBmp);
}
BitBlt(hdcX,0,0,rx.Width(),rx.Height(),hdc,0,0,SRCCOPY);
SelectObject(hdc,hOldBmp);
DeleteObject(hBmp);
DeleteDC(hdc);
ReleaseDC(hWnd,hdcX);
}
FUN_FINALLY
}


将此函数屏蔽,就不会有泄漏,但是,即使函数有问题,但是该函数根本就没有运行到,因为根本就没有调用
...全文
320 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2014-05-18
  • 打赏
  • 举报
回复
可能本来就不能要: "dependent project A Microsoft® Visual Studio™ project with outputs that are specified as part of a Web project. For example, Microsoft® Visual J++™ projects can be added to a Web project as a dependent project and built while in Microsoft® Visual InterDev™. "
schlafenhamster 2014-05-17
  • 打赏
  • 举报
回复
"从附加依赖项中移掉" IDE 的问题 ?
worldy 2014-05-17
  • 打赏
  • 举报
回复
问题解决: 将OpenCV的库文件从附加依赖项中移掉,在需要OpenCV库的头文件中加入:
#ifdef _DEBUG
	#pragma comment(lib,"opencv_core246d.lib")	
	#pragma comment(lib,"opencv_imgproc246d.lib")	
	#pragma comment(lib,"opencv_highgui246d.lib")
	#pragma comment(lib,"opencv_ml246d.lib")
	#pragma comment(lib,"opencv_video246d.lib")
	#pragma comment(lib,"opencv_features2d246d.lib")
	#pragma comment(lib,"opencv_calib3d246d.lib")
	#pragma comment(lib,"opencv_objdetect246d.lib")
	#pragma comment(lib,"opencv_contrib246d.lib")
	#pragma comment(lib,"opencv_legacy246d.lib")
	#pragma comment(lib,"opencv_flann246d.lib")
#else
	#pragma comment(lib,"opencv_core246.lib")	
	#pragma comment(lib,"opencv_imgproc246.lib")	
	#pragma comment(lib,"opencv_highgui246.lib")
	#pragma comment(lib,"opencv_ml246.lib")
	#pragma comment(lib,"opencv_video246.lib")
	#pragma comment(lib,"opencv_features2d246.lib")
	#pragma comment(lib,"opencv_calib3d246.lib")
	#pragma comment(lib,"opencv_objdetect246.lib")
	#pragma comment(lib,"opencv_contrib246.lib")
	#pragma comment(lib,"opencv_legacy246.lib")
	#pragma comment(lib,"opencv_flann246.lib")
#endif
这样,就不会报告泄漏了。 问题虽然解决,但是不明就里,欢迎各位新老高手踊跃讨论
worldy 2014-05-17
  • 打赏
  • 举报
回复
引用 19 楼 crestine 的回复:
这貌似是因为使用了 debug 版的库
那是肯定,不然也不会报内存泄漏
caewow 2014-05-17
  • 打赏
  • 举报
回复
这貌似是因为使用了 debug 版的库
worldy 2014-05-17
  • 打赏
  • 举报
回复
引用 17 楼 schlafenhamster 的回复:
"从附加依赖项中移掉" IDE 的问题 ?
呵呵,不知道,就是不知道什么原因,超出了我能懂的了
oyljerry 2014-05-13
  • 打赏
  • 举报
回复
引用 13 楼 worldy 的回复:
[quote=引用 11 楼 oyljerry 的回复:] 报内存泄露也是代码扫描,不一定要调用到 可能opencv本身一些代码被误判了 可以运行的时候观察, 看虚拟内存是否会增加
这个说法应该不对吧,代码扫描还能扫描的清楚,比如在一个循环里new,扫描怎么可能知道new了几次[/quote] 所以扫描工具可能误判。也可能代码本身有问题,没有扫描出来
schlafenhamster 2014-05-12
  • 打赏
  • 举报
回复
“去除所有opencv 的宏试试” 试 过没有 ?
worldy 2014-05-11
  • 打赏
  • 举报
回复
引用 11 楼 oyljerry 的回复:
报内存泄露也是代码扫描,不一定要调用到 可能opencv本身一些代码被误判了 可以运行的时候观察, 看虚拟内存是否会增加
这个说法应该不对吧,代码扫描还能扫描的清楚,比如在一个循环里new,扫描怎么可能知道new了几次
猞猁狲 2014-05-11
  • 打赏
  • 举报
回复
在项目属性里->C++->Code Generation->结构体对齐 改成1字节对齐或者改成别的试试?
oyljerry 2014-05-10
  • 打赏
  • 举报
回复
报内存泄露也是代码扫描,不一定要调用到 可能opencv本身一些代码被误判了 可以运行的时候观察, 看虚拟内存是否会增加
schlafenhamster 2014-05-10
  • 打赏
  • 举报
回复
去除所有opencv 的宏试试 CV_FUNCNAME("ShowCvImage" ); FUN_BEGIN .....
worldy 2014-05-10
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:
函数被隐含执行的 只有 构造函数, 请 检查 各个类的 构造函数.
没有跟那个函数有关的构造函数啊
schlafenhamster 2014-05-10
  • 打赏
  • 举报
回复
函数被隐含执行的 只有 构造函数, 请 检查 各个类的 构造函数.
worldy 2014-05-10
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster 的回复:
把: void ShowCvImage(HWND hWnd, const IplImage* pImg) 写成空函数.即马上return;
这样就不会报泄漏,实际上,只要把if(hDC)块注释掉,就不会报泄漏,太奇怪了,这个函数肯定没有被引用,没有被执行的
schlafenhamster 2014-05-10
  • 打赏
  • 举报
回复
把: void ShowCvImage(HWND hWnd, const IplImage* pImg) 写成空函数.即马上return;
凌乱哥 2014-05-10
  • 打赏
  • 举报
回复
当然是说模块和函数还在的时候,查出是哪里内存泄露了
worldy 2014-05-10
  • 打赏
  • 举报
回复
引用 2 楼 dingxz105090 的回复:
应该是其他地方的问题,关键得查出是哪里泄露了
将模块移除,或将该函数注释掉,就不会报告泄漏,一切就很干净利落
worldy 2014-05-10
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
断点看看有没有被调用.
断点过,确认没有被调用
凌乱哥 2014-05-10
  • 打赏
  • 举报
回复
应该是其他地方的问题,关键得查出是哪里泄露了
加载更多回复(1)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧