vs2017多个源文件单独运行(vs2019一个项目如何创建多个源文件)

vs2017多个源文件单独运行(vs2019一个项目如何创建多个源文件)文章目录 VS2017 项目构成 1 解决方案资源管理器 2 子系统 3 运行 VS2017 项目执行步骤 路径宏 项目属性 Release 和 Debug 的区别 win32 和 win64 的区别 大型项目开发的文件夹管理 头文件的路径问题 引用头文件的原理 结论 DLL 动态链接 如何查看程序调用的动态链接文件 外部依赖模块 实战 opencv 的使用 实战 多项目开发

大家好,我是讯享网,很高兴认识大家。



文章目录

  • VS2017项目构成
  • 1. 解决方案资源管理器
  • 2. 子系统
  • 3. 运行
  • VS2017项目执行步骤
  • 路径宏
  • 项目属性
  • Release和Debug的区别
  • win32和win64的区别
  • 大型项目开发的文件夹管理
  • 头文件的路径问题
  • 引用头文件的原理
  • 结论
  • DLL动态链接
  • 如何查看程序调用的动态链接文件?
  • 外部依赖模块
  • 实战:opencv的使用
  • 实战:多项目开发
  • 启动项目设置和项目依赖关系设置
  • Project2.dll的导出和导入
  • 头文件与重复定义符号
  • VS2017 Debug
  • 内存溢出
  • 内存泄漏
  • 远程调试
  • 整理

1. 解决方案资源管理器

vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_头文件
讯享网

2. 子系统

子系统的配置方式为 属性页->链接器->系统->子系统

vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_visual studio_02

点击子系统后,下方会出现微软的官方解释:当双击exe文件后,子系统会告知操作系统运行的入口函数,默认是int main(),可以在 属性页->链接器->高级->入口点 进行设置。

补充:链接器->常规 和 链接器->输入 也很重要,当我们使用外部一些封装好的库函数的接口(ddl或者lib文件),就需要进行配置。链接器->调试可以设置调试的pdb文件,因为编译是单向的,于是VS通过将cpp文件和obj文件建立字典,即pdb文件,由此实现调试。

3. 运行

可以右键项目->生成解决方案,也可以点击“本地Windows调试器”,直接生成并运行调试我们的代码,后者更加常用。

VS的项目生成大概需要四步:分析、编译、链接和生成。

  • 分析,主要检查语法错误,在”错误列表”中查看
  • 编译,将解决方案资源管理器中的cpp文件都编译为obj文件,这里执行了中的预处理、编译、汇编三个步骤
  • 链接,以main.cpp为根节点(可右击项目->属性->链接器->高级,设置入口点),将所有与之相关的obj文件链接起来,一方面将没有用到的编译内容进行了删减,另一方面对外部变量和函数进行了匹配(例如定义在其他文件中或者ddl文件中的变量,诸如),”连接错误”往往就是这里的问题;
    注意:所有在cpp文件下的变量定义和函数定义都是全局的,整个项目都共享(只是项目,不是解决方案),所以同一个项目的全局变量的命名不能冲突。
  • 生成,在Debug文件下生成了可执行文件,但是这是一个调试程序,里面有大量对VS的依赖,在没有安装对应版本的VS的电脑上无法运行,需要进行独立打包才能在其他电脑上运行。

VS中目录的设置都是宏的形式,和C++ define一样,只是所有的路径都是相对路径,更加灵活。

VS配置属性中的常规->输出目录,是生成exe文件的Debug文件夹;配置属性中的调试->工作目录,是调试时候的目录,两者一般不同。在程序中如果用相对路径寻找一个文件,在调试的时候,是以后者为出发点查找,但是如果双击exe文件,则是以前者为出发点查找,这就会出现调试时没有问题,但是双击exe会显示文件找不到的问题——此时,就需要修改两个路径宏,使之相同。

点击属性页的右上角的”配置管理器”,可以看到不同项目的运行配置方式:

vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_c++_03

在配置属性的常规目录下,我们可以看到

vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_解决方案_04

VS将这些配置字段和值保存成xml文件的格式,这个思路在开发中经常会用到,保存的文件后缀名为如下所示

vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_头文件_05

Release和Debug的区别

一般来讲,写代码和调试代码使用Debug模式,发布代码使用release模式,前者编译时可以放弃优化,保持代码的原始性,后者则会对代码做较大的优化,不利于调试查看。

两者在变量的初始化上也有较大不同,例如,release模式下初始值为0,debug模式下初始值为或者。

win32和win64的区别

为了保证代码的可移植性,一般使用win32即可,如果代码中涉及到较多的int64和double类型,使用win64会在速度上有优势。

VS默认的项目文件夹目录并不适合大型项目的代码管理,特别是需要用到云开发的时候,典型的就是Github 和 Azure。首先要明确,服务器只保存用户数据,不保存VS的生成文件,直白的说,就是如何上传最小的文件让用户下载下来可以编译运行,因此只需要上传:

  1. 用户源码,.cpp文件和.h文件
  2. 项目配置文件和解决方案文件,前者包括,,,后者就是.sln文件
  3. 素材媒体文件
  4. 第三方库文件

所以重新调整了之前的解决方案路径:

vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_c++_06

分为四个大文件:

  • 第三方库
  • 各个项目的配置文件夹
  • 媒体文件夹
  • 代码文件夹
  • 头文件夹
  • 源文件夹

    </li></ul><ul data-indent="2"><li>项目1</li><li>项目2</li></ul><p>其实就是将原来的Debug,Release文件夹都不要,只需要将配置文件.vcxproj、头文件.h和源文件.cpp整理昊即可,之后创建新的cpp文件和头文件也要放在对应的目录下面,而不要使用默认路径。</p><p>VS通过intelllisense功能自动补全(编辑-&gt;Intellisense)。</p><h4 id="h12">引用头文件的原理</h4><p>我们知道C++有两种引用头文件的方法:</p><div></div><p>但是VS的intellisense在前者不会自动补全,后者却能够自动补全,管理<strong>后者</strong>的<strong>搜索路径的设置</strong>就在 中,如下图所示,可见搜索路径包括自定义的搜索路径和从项目属性管理器中继承的值,例如下面的项目就自动继承了和这两个值:</p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d5f3ceb27036.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_头文件_07' title="在这里插入图片描述" style="width: 796px; visibility: visible;"></p><p>可以<strong>通过打开“属性管理器”查看第二种方法链接的一部分lib文件</strong>,如下图所示:</p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_解决方案_08' title="在这里插入图片描述" style="width: 322px; visibility: visible;"></p><p>该项目显示有三个属性:Core Windows Libraries,Multi-byte Character Support,Microsoft.Cpp.Win32.user,分别代表链接的C++ lib文件、多字节 lib文件、win32 lib文件,以.props的格式存储,其中,以Core Windows Libraries的props文件如下所示:</p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d631a8e88207.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_visual studio_09' title="在这里插入图片描述" style="width: 796px; visibility: visible;"></p><p>而<strong>debug所作的就是将这三个属性表(.props文件)拼接成一份属性页</strong>。</p><p>但是,<strong>Toolset.props</strong>并没有通过属性管理器中,而是在.vcxproj中加载的,.vcxproj加载这个属性表的代码片段 如下图所示:</p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d6446bc6434.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_开发语言_10' title="在这里插入图片描述" style="width: 647px; visibility: visible;"></p><p>Toolset.props中导入 和的代码如下图所示:</p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d65e0a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_解决方案_11' title="在这里插入图片描述" style="width: 796px; visibility: visible;"></p><p>总结:通过属性管理器中的props和.vcxproj中加载的Toolset.props管理链接的lib文件地址,底层都是通过加载.props文件实现的。</p><h4 id="h13">结论</h4><p>的搜索路径在,而的搜索路径保存在,因此如果不想头文件和Windows标准文件混在一起,可以使用,并在属性页中配置搜索路径。</p><h4 id="h15">如何查看程序调用的动态链接文件?</h4><p>通过任务管理器的资源监视器,我们在CPU中找到运行程序的进程,选定VSDebugConsole以后,在下面的“关联的模块中”会出现这个程序所依赖的dll文件,如下图所示:</p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d67d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_解决方案_12' title="在这里插入图片描述" style="width: 796px; visibility: visible;"></p><h4 id="h16">外部依赖模块</h4><p>外部依赖模块的链接分为静态链接和动态链接。</p><p><strong>动态链接</strong>,诸如dll文件,<strong>当程序启动的时候</strong>在PATH路径下查找所需要的dll文件并加载到内存中。</p><p><strong>静态链接</strong>,诸如lib文件,<strong>在链接期</strong>就被编译进当前的项目文件中了,但是静态链接编译出来的文件比较大,而且不够灵活,所以用的比较少。</p><p>所以如果出现dll文件无法找到的问题,往往需要检查PATH路径是否正确,或者将dll文件和调用dll的exe文件放在一起。</p><h4 id="h17">实战:opencv的使用</h4><p>首先,下载opencv,需要说明的是,流行的第三方库往往是Cmake项目,基于源码使用Cmake生成的VS项目,然后再编译出所需要的dll、lib和pdb文件。下载解压之后的opencv文件夹包括build和source两个文件夹,前者是我们会用到的,后者是debug源码时会用到的。</p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d6a1fc.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_开发语言_13' title="在这里插入图片描述" style="width: 762px; visibility: visible;"></p><p>打开build文件夹,其中的include放置头文件,而x64放置生成的对应于64位系统的lib、pdb和dll文件,分别对应链接、调试和运行,如果是x86则是32位系统的。</p><p>然后<strong>设置头文件include的搜索目录</strong>,将opencv的include文件夹添加到C/C++的附加包含目录中:</p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d6bfa0e94345.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_解决方案_14' title="在这里插入图片描述" style="width: 796px; visibility: visible;"></p><p>之后,<strong>设置链接的lib文件路径</strong>,添加opencv对应VS版本的lib文件的文件夹路径到下,再将lib文件添加到中,这两步操作如下图所示:</p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d6e.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_解决方案_15' title="在这里插入图片描述" style="width: 796px; visibility: visible;"></p><p><br></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d70aec034448.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_visual studio_16' title="在这里插入图片描述" style="width: 796px; visibility: visible;"></p><p>注意:这里的附加库目录要根据VS版本选择合适的include文件夹,附加依赖项则要分清release和debug版本——其实如果设置好了附加库目录,此处的附加依赖项似乎并不是必须的,因为代码中还能够直接加载,之所以这么做,是为了让项目的依赖项更加明了,而不用去cpp文件里找加载的依赖项。</p><p>之后就可以愉快的写代码了。</p><p>如果调试代码的时候,如果出现“无法解析的外部符号”错误,可以按照上面的方法<strong>检查一遍链接器设置</strong>,如果报“找不到opencv_world4000d.dll文件”错误(如果你前面配置合适这个问题并不会出现,但是有时候必须自己下载一些丢失的dll文件),此时本地确实没有该文件,可以按照debug和release两种途径有两种方法:</p><ol><li>debug<br>将附加依赖库文件夹lib的同级bin文件夹设置为环境变量</li><li>release<br>在添加诸如,即将找不到的dll文件夹复制一份到exe的目录下面,当然debug模式也可以使用该方法,这样的好处是,程序的依赖项目都集中在生成目录下,方便最后打包。</li></ol><h4 id="h18">实战:多项目开发</h4><p>多项目开发的主旨是尽可能的实现代码的模块化,减少对其它项目的依赖性,最好能够独立实现它设计的功能。</p><h5>启动项目设置和项目依赖关系设置</h5><p>右键解决方案-》添加-》新建项目-》空项目,将新建项目的项目属性页修改为动态库(.dll)。</p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d75f.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_解决方案_17' title="在这里插入图片描述" style="width: 796px; visibility: visible;"></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d7814cc96316.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_解决方案_18' title="在这里插入图片描述" style="width: 796px; visibility: visible;"></p><p>此时,我们会发现解决方案资源管理器中的启动项目Project1为高亮显示,而其他项目是普通的。右击解决方案,可以设置启动项目是单项目还是多项目:</p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d7a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_c++_19' title="在这里插入图片描述" style="width: 796px; visibility: visible;"></p><p>这里要注意一点:调试的时候只会生成启动项目,如本文中的例子,Project1是启动项目,虽然Project1会使用Project2的生成DLL,但是我们进行本地Windows调试器调试的时候Project2是默认不生成的。虽然解决方案的“生成解决方案”会生成其他非启动项目Project2,但是这是不可行的。因为生成解决方案的生成顺序是和项目添加顺序相关,即不能完全保证Project1在Project2生成之后开始生成。为什么要保证这个顺序?因为Project1需要在链接期间使用Project2的.lib文件。(总结:调试只能生成启动项目,而生成解决方案并不能保证生成项目的顺序)</p><p>如何让VS能够保证这种生成顺序关系呢?就是添加项目依赖项,也在解决方案属性页里面:</p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d7c2ce.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_头文件_20' title="在这里插入图片描述" style="width: 796px; visibility: visible;"></p><p>应该注意两点:Project依赖于Project2,表明Project2会先于Project1生成,这样Project1使用的Project2的lib文件就是最新的,否则会出现找不到lib文件的错误;千万不能出现项目相互依赖的情况。</p><p>总之,<strong>多项目开发一定要注意启动项目的设置和项目依赖关系的设置</strong>。</p><h5>Project2.dll的导出和导入</h5><p>在Project2中添加文件,并实现一个对整数的加密函数:</p><div></div><p>因此还需要添加一个头文件,声明函数:</p><div></div><p>但是这样只能在当前项目Project2中被引用,要想跨项目调用,必须将函数接口导出到dll文件的导出列表中,因此首先在Project2的 中添加本项目的项目标识符,然后修改:</p><div></div><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d7dcc.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_头文件_21' title="在这里插入图片描述" style="width: 796px; visibility: visible;"></p><p>此时生成解决方案,在生成目录下会出现一个Project2.dll文件。接下来就需要在Project1中设置头文件路径(引用目录)和lib路径(附加库目录和附加依赖项)了,此处的步骤和配置opencv相似,然后在Project1中可以直接,然后使用CryptInt函数了。</p><p>有时候我们会遇到头文件相互包含的问题,例如a.cpp中导入了b1.h和b2.h,但是b1.h和b2.h同时导入了c.h,此时一个cpp文件包含了多个相同的头文件,就会报<strong>编译错误</strong>。为了避免头文件重复包含,需要在头文件开头加上。</p><p>但是,上述方法仅能检测一个cpp文件的重复定义,对于多个文件并不管用,假设同一个项目下的a.cpp和b.cpp分别引用了b1.h,而且b1.h中同时定义了int变量,此时就会报错:重复定义了变量,这是初学者经常容易犯的错误,即在头文件中定义变量和函数,此时的错误属于<strong>链接错误</strong>。</p><p>对于头文件造成的同一个项目下不同cpp文件重复定义变量和函数的解决方法——<strong>头文件中只能写入声明,而不是定义</strong>,需要将头文件写成以下形式:</p><div></div><p>VS调试分为<strong>主动调试</strong>和<strong>被动调试</strong>——主动调试:即编译并运行,就是“本地Windows调试器”;被动调试:这个需求比较灵活,一般是程序已经发布了release版本,直接双击exe运行而不依赖于VS了,而exe运行过程中可能会报错,可能状态异常,这时候我们需要通过VS去链接到这个exe进程进行调试。</p><p>VS的调试页面如下所示:</p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d80418f52478.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_解决方案_22' title="在这里插入图片描述" style="width: 796px; visibility: visible;"></p><p>其提供了切换线程、堆栈、输入地址查看连续内存对应的数据、诊断工具查看CPU占用率和每行代码的内存创建情况、调用堆栈查看函数崩溃时所在的行号、监视器查看变量的值等功能,这些都可以在调试菜单》窗口中打开。</p><h4 id="h21">内存溢出</h4><p>内存溢出:也就是<strong>内存访问越界</strong>,一般出现于数组和指针的使用中。这是一个比较致命的bug。一般情况下,程序都会立即崩溃,提示“0x???内存读取访问权限冲突”,也可能不会崩溃,但是你的程序总是会有时候运行异常。</p><p>这时候我们可以使用VS的<strong>条件断点</strong>找到该变量被修改的时刻, 有两种方法:</p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d822c.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_开发语言_23' title="在这里插入图片描述" style="width: 762px; visibility: visible;"></p><p>或者 新建数据断点</p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d85586c82989.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_头文件_24' title="在这里插入图片描述" style="width: 646px; visibility: visible;"></p><p><br></p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d87650c49955.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_解决方案_25' title="在这里插入图片描述" style="width: 796px; visibility: visible;"></p><p>第二种方法, 还可以设置条件表达式断点, 但是会严重拖慢程序的运行速度, 因此不建议使用.</p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_开发语言_26' title="在这里插入图片描述" style="width: 796px; visibility: visible;"></p><h4 id="h22">内存泄漏</h4><p>内存泄漏:相较于内存溢出,它的危害要小一些。泄漏就是<strong>申请的内存没有合理回收,导致出现不可使用的内存片段</strong>,大量的泄漏最终还是会导致程序无法申请到新的内存而崩溃。(分区的概念,可以参考csapp)</p><p>例如下面的程序,new了新的数组后并没有及时delete,在test结束运行后,堆区里的数据仍然没有被释放,这块区域也就处于完全不可用的状态,内存就会越用越少:</p><div></div><p>我们可以通过内存占用率》堆分析 快速定位堆上没有及时释放的内存:</p><ol><li>在main函数的开始,截取当前的堆快照</li><li><li>在main函数的最后,再截取一次堆快照,此时如果堆的大小增加了,则说明发生了内存泄漏</li><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d8c.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_c++_27' title="在这里插入图片描述" style="width: 770px; visibility: visible;"></p></li><li><li>点击右下角的堆快照,可以查看没有被释放的对象类型,以及new该对象时的代码行号,点击行号,VS就会自动定位到定义该对象的那一行:</li><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d8e.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_头文件_28' title="在这里插入图片描述" style="width: 770px; visibility: visible;"></p><li><br></li><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_65f5b3d92666e95636.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='vs2017能编译unity项目 vs2019为啥不行 vs2017编译运行按钮在哪_visual studio_29' title="在这里插入图片描述" style="width: 770px; visibility: visible;"></p></li></ol><p>这里原作者首先介绍了Windows蓝屏时的处理机制, 并以此为例子, 说明了如何基于Windows标准库上报和分析崩溃信息(dump文件)。</p><p> </p> 

    讯享网
小讯
上一篇 2025-04-19 11:14
下一篇 2025-05-27 19:43

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/174543.html