JCHub

  • Home
  • Category
    • A/V
    • WebRTC
    • Beauty of Programming
    • Linux
    • Windows
    • Moments of Life
    • Campus Life
  • Reference
    • API Reference
    • Utilities
    • AV Test
    • Doc
  • Message Board
  • About
VC++
Windows

Visual Studio检查内存泄露方法

在测试自己写的程序时,我们一般都会去任务管理器查看程序内存状况,看内存是否随着时间一直增长,如果一直增长,那恭喜了,程序内存泄露了。 编写程序时要养成良好习惯,申请的内存要记得释放,遇到内存泄露时要认真查看申请的内存释放了没,除此之外,我们也可以通过第三方帮助我们发现程序内存泄露状况。 _CrtDumpMemoryLeaks函数 系统自带的 C Run-Time (CRT)库可以帮助我们检测内存泄露,使用很简单。 1)包含相应头文件 [crayon-69c6a632dc011814688886/] 2)在程序退出地方,加上: [crayon-69c6a632dc01c359155810/] 在调用_CrtDumpMemoryLeaks函数前我们要确保释放了该释放的内存,最后程序结束后在Output窗口就会打印出内存泄露信息。 3)如果我们程序有多个退出点,需要都添加上_CrtDumpMemoryLeaks函数,比较麻烦,此刻_CrtSetDbgFlag 函数就比较方便了。在程序初始化地方加上: [crayon-69c6a632dc020933666884/] 这个函数会在我们程序每个退出点自动执行_CrtDumpMemoryLeaks 函数。 对于如何定位内存泄露代码以及其他使用,可以看下MSDN上的介绍:https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx。 Visual Leak Detector(VLD)插件 给我们的VS装上该插件,下载地址:https://vld.codeplex.com/,使用方法很简单,安装完插件后,在我们要检测的文件加上 [crayon-69c6a632dc024320378061/] 然后在debug模式下运行,在Output窗口即可查看详细泄露信息,其实该插件原理就是上一节说到的CRT库。比如我们下面一段测试代码: [crayon-69c6a632dc027619763887/] 上述代码我们注释掉了delete部分,debug运行结束后我们可以看到Output窗口显示泄露了10字节,同时打印出泄露的堆栈,如果程序复杂的话,我们可以在Output窗口双击泄露的堆栈定位到相应代码。 VS2015内存快照 在VS2015引入了强大的内存查看工具,在程序运行时,右侧窗口我们可以查看程序内存状况。通过截取某两个不同时刻的内存快照,进行对比,可以快速找到泄露部分。同样还是上面的测试代码,不过得注释掉include vld头文件这一行,我们按如下步骤定位泄露部分。 1)在LeakTest处打个断点,debug运行,在右侧窗口->Memory Usage标签页中启用Heap Profiling。 2)点击Take Snapshot,相当于一次拍照(这图标就是一个相机),此刻下面即可显示当前分配的内存大小,堆大小。 3)执行完测试函数后,我们再次点击Take Snapshot按钮,此刻提示了与上一次快照的变化。 4)点击括号处(+1)或(+0.04KB)变化部分链接。 5)在左侧窗口查看与前一次快照对比,具体什么数据造成内存变化。 6)双击后查看定义为char类型数据的具体实例,我们程序中只定义了一个char类型数据,所以只有一个实例,再双击某个实例可以定位到具体代码,同时查看相应堆栈调用,由于测试程序太简单了,所以这里看不到。 拿我以前写的一个复杂程序举例,程序中我定义了多个CString类型数据,点击查看CString数据具体实例。 我们可以看到多个CString数据实例,点击某个实例就可以看到堆栈调用了,双击具体的堆栈调用可以定位到具体代码。 详细使用可以参考微软官方博客:https://blogs.msdn.microsoft.com/vcblog/2015/10/21/memory-profiling-in-visual-c-2015/,我就不细说了。

2016年6月7日 1comments 5868hotness 35likes Jeff Read all
Windows

如何让MFC或其他VS编译的程序支持高DPI

如今显示器的分辨率是越来越大,2K,4K分辨率的都很常见了。在高分屏下,我们必须对DPI进行缩放,要不显示字体会很小。一般系统默认DPI缩放级别为100%。如果改成150%,200%或者其他,我们会发现部分程序界面显示错乱,这是因为这些程序没有对高DPI进行处理。在VS中编写程序时可以很容易的做到支持DPI。 第一种方法是修改程序的Mainfest,如下图,我用的是VS2015,在属性页的Mainfest Tool中进行修改。 第二种方法是使用SetProcessDpiAwareness函数: [crayon-69c6a632ddc9f477285662/] 传入的参数有三个取值选择: [crayon-69c6a632ddca9858832097/] 对应前面VS设置中的三个选项,具体使用可以参考SetProcessDpiAwareness function

2016年1月8日 0comments 5846hotness 16likes Jeff Read all
Windows

VC实现程序单实例运行

有时候我们希望我们的程序只能运行一个实例。常见的一个方法是通过创建互斥对象实现。在主程序中加入如下代码即可实现: [crayon-69c6a632de59d864801687/]

2015年11月25日 0comments 1989hotness 0likes Jeff Read all
A/V

使用libVLC实现的播放器:支持双击全屏

背景 最近在学习duilib这个库,看了网上Alberl的教程,他那个仿迅雷播放器做的不错,我就直接拿来学习duilib了。不过这个播放器有个缺点,就是无法双击全屏,也就是鼠标放到libVLC播放窗口时无法响应消息,消息都被libVLC内部处理了。这对我们而言不是很方便。因为有时我们需要双击全屏,或者弹出鼠标右键菜单做一些操作。后来上网查了下,好多人遇到这个问题。下面是一些查到的解决方法。 解决libVLC无法响应鼠标消息 如下是查到的一些方法: 1)使用全局钩子; 2)修改libVLC鼠标消息处理代码,重新编译; 3)禁用子窗口消息。 第一种方法不安全,容易被杀毒软件干掉,而且效率不高,第二种方法麻烦,编译就得花你好多时间,而且很麻烦,第三种方法比较简单,解决方法如下: [crayon-69c6a632deec9512607696/] 具体实现见下面。 基于duilib实现 duilib学起来还是很容易上手的,这里我的代码是基于Alberl的仿迅雷播放器。最后实现的界面如下: 按照上面的解决方法,在这个程序中我是这么解决无法响应消息的: 1)当开始播放某个文件后,创建一个一秒的定时器(也可以不创建,直接跳到直接第二步,创建定时器是为了确保我们处理时VLC窗口已经生成); [crayon-69c6a632deed1075804230/] 2)在定时器的回调函数中枚举得到VLC创建的窗口的句柄,通过spy++可以了解到libVLC创建的播放窗口名为:VLC video output,获取到VLC窗口的句柄后使用EnableWindow函数禁用掉键鼠输入,EnableWindow函数的作用是允许/禁止指定的窗口或控件接受鼠标和键盘的输入,代码如下: [crayon-69c6a632deed6451077975/] 通过如上方法,在VLC播放窗口上的鼠标键盘消息我们都可以获得,这样就可以去实现自己想要的功能。比如我在全屏时响应WM_MOUSEMOVE消息,实现底部播放面板自动隐藏。双击全屏也很简单,当响应双击消息时,只显示作为libvlc父窗口那个控件,其他控件都隐藏即可。整个播放器的代码我已经上传到Github。 地址:https://github.com/yjfxfjch/JCHPlayer 我是用的是VS2015编译,低版本VS可能无法直接打开编译。下面一节是使用MFC做界面实现的版本。 基于MFC实现 1)在MFC对话框程序中,首先添加一个控件,这里我添加了一个Picture Contron:IDC_PLAYWND; 2)获得IDC_PLAYWND控件句柄; [crayon-69c6a632deed9150620314/] 3)让libVLC播放对象设置gPlayHwnd 为播放窗口句柄,这样libVLC播放窗口就成为IDC_PLAYWND控件的子窗口; [crayon-69c6a632deedd000650593/] 4)开始播放后创建一个定时器(也可以不创建,直接EnableWindow相应窗口句柄); [crayon-69c6a632deee2092946158/] 5)定时器回调函数以及处理过程如下: [crayon-69c6a632deee5971292688/] 在上述代码中,我们通过之前得到的IDC_PLAYWND控件句柄枚举得到子窗口VLC播放窗口句柄,接着通过EnableWindow函数禁止VLC播放窗口接受鼠标键盘输入。这时我们的程序就可以响应鼠标点击libVLC播放窗口的消息了; 6)设置全屏,主要是设置IDC_PLAYWND控件全屏时占满整个屏幕,然后隐藏其他控件以及标题栏,这样VLC子窗口就可以全屏播放了。不需要使用libvlc_set_fullscreen这个内置api,使用这个api无法达到效果。 最后实现的简单版本如下: MFC版本支持双击全屏的libvlc播放器代码我也上传到Github,具体的可以去看下。 Github地址:https://github.com/yjfxfjch/SimpleVlcPlayer

2015年11月23日 15comments 11030hotness 12likes Jeff Read all
Beauty of Programming

MFC WebBrowser控件如何实现滚动条滑动

最近在写一个自动刷流量的程序,用到了WebBrowser 控件,通过该控件往程序嵌入一个IE浏览器,MFC中如何嵌入该控件可以看下参考链接1。 由于要自动刷流量,所以就要模仿用户平时浏览网页的习惯,也就是打开网页,然后慢慢向下滚动鼠标。在程序中我是通过滑动右侧滚动条实现的。刚开始我的代码是参照链接3给的,不过该代码在有些网页下实现不了滚动条滑动,也就是没反应。我上网Google了下,发现好多人也遇到类似情况,比如链接2与链接4中的内容,不过都没人给出答案。我自己也试了好多种方法,比如修改WebBrowser的IE版本,最后也都是以失败告终。 过了几天在Google上搜索,无意间看到一段代码,试了下,有效果,在不同类型网页下都可以顺利滚动。哈哈哈。废话不多说,直接上代码: [crayon-69c6a632e048b516143655/] 通过上面函数的代码我们就可以实现WebBrowser向下滑动100像素。需要提醒的是,如果编译器提示undeclared identifier错误,我们需要包含mshtml.h文件。 [crayon-69c6a632e0494834041298/] 到此就大功告成了,用定时器结合该代码就可以实现一个自动刷流量的程序,详细的我就不说了。 参考链接: 1)VC中调用WebBrowser简单的实现过程(图解过程) 2)如何获得webBrowser控件滚动条滑块的位置问题补充 - VC/MFC / 界面 3)Programmatically scrolling WebBrowser control from Visual C/C++ 4)webbrowser control: auto scroll + total webpage size

2015年7月21日 0comments 2150hotness 0likes Jeff Read all
Copyright Statement

Unauthorized reproduction or plagiarism in any form is strictly prohibited. For reprint requests, please contact via email.

Recent Comments
snail Published at 6 hours ago(03 03202633105 27 27pm26) 多谢,大佬。醍醐灌顶!
Bramsnawl Published at 13 hours ago(03 03202633110 27 27am26) Proper blood collection playing cards are measure ...
NasibDepdrotte Published at 1 days ago(03 03202633110 26 26pm26) Inf ect isC linNo rth A m viiiix, Sm ets o urgo is...
Pereplanirovka kvartir_cvsr Published at 2 days ago(03 03202633105 25 25pm26) перепланировка услуги [url=https://pereplanirovka-...
Mirzoemele Published at 3 months ago(01 01202613104 06 06pm26) Double blind randomised controlled trial of two to...
Ad

COPYRIGHT © 2026 jianchihu.net. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang