VS2005中条件断点和内存变量监测 && C++中的#include包含和class包含区别

昨天听了一个同事关于程序调试的讲座,有很多东西都是自己知道的,但也学到了几个知识点,其中有一个有趣的小问题,正好是之前困惑我的,同事说类的弱引用和强引用,我觉得这个词好像不是用在这个场合,感觉弱包含和强包含更合适些,可查了一下没有这个叫法,我还是直接说#include和class包含的区别吧。

    昨天主要讲了程序调试方法和怎么预防bug,其中调试方法学到了两个自己以前没用过的,一个就是条件断点,我们调试时加断点单步调试,但有时一个很大的循环,我们只想单步跟踪最后几次循环,通过条件断点和断点命中次数设定,可以方便地让程序停止,而不用一次又一次按F5等到循环次数到达自己想要的。下面是一个例子,让程序在第50次循环时停下来。从图1中可以看到不仅可以设条件,还可以设置命中次数和过滤。图1选择"Condition".

图1

 

图2 设置条件

图3 结果,在第50次时程序停止

 

   当有一个指针在程序中很多地方被用到时,如果想跟踪在哪里被改变时是比较困难的,有时需要设置很多断点,然后把这个指针添加到watch中,一边执行程序一边观察它是否被改变,通过内存监测可以方便地实现这种功能。步骤如下图。

图1 查看要监测的内存

 

 

图2 添加内存监测

 

图3 设置内存地址

图4 内存中的内容被改变,程序中断

 

    昨天讲到预防BUG的其中一个方法是解决程序中的每一个警告,因为每个警告都有可能导致你程序后期出现问题,其中一个例子大致如下:

 

#ifndef  RESOURCE_H
#define  RESOURCE_H

class mybitmap;

class resource
{
public:
 resource();
 ~resource();
private:
 mybitmap* m_pBitmap;
};

#endif

 

resource::~resource()
{
 if ( NULL != m_pBitmap )
 {
  delete m_pBitmap;
 }
}

 

这个程序可能会导致内存泄漏,程序在编译时会有一个警告: deletion of pointer to incomplete type 'mybitmap'; no destructor called。而为什么会导致内存泄漏,这就跟之前让我有些困惑的#include和class包含区别有关了。两者主要有以下区别如下:

1.class A 声明仅仅告诉程序有这样一个类,你可以在这里声明类A的一个指针,但是此处并不能获得类A的具体信息,如果定义类A的一个指针是可以的,但定义一个类A的对象,则程序是错误的,因为不知道A的具体信息,故无法生成一个对象,即上面程序中如果定义mybitmap m_Bitmap则程序会报错的。而#include 是把文件中的所有信息包含进来,可以进行权限内的任何操作。

2.很多地方使用class声明是为了减少编译依赖,因为一个比较大的工程进行一次编译需要很长时间,像一类基类或抽象类,通常只定义接口和指针,所以在这种情况下常常只用class声明就行了。

 

根据上面的分析,就很容易知道上面程序的错误了,因为程序中用class声明的mybitmap类,在执行delete m_pBitmap时,因为它不知道mybitmap类的具体信息,所以无法调用它的析构函数,故内存并没有释放,造成内存泄漏。

转:http://blog.csdn.net/llsll21/article/details/5812200

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值