VC++——手把手学会调试程序监控内存

前言

为了更好地学习数据结构,我们来了解一下怎么通过vc++去调试程序,监控内存。

 

 

 


调试步骤

建立C++项目

下面是我的C++项目的代码,是数据结构的顺序队列的应用。

//定义队列中元素的最大个数
#define MaxSize 10 

typedef int ElemType;

typedef struct{
	//用静态数组存放队列元素
	ElemType data[MaxSize];
	//队头指针和队尾指针
	int front,rear;
}SqQueue;


void InitQueue(SqQueue &Q){
	//初始时,队头、队尾指针指向0
	Q.rear=Q.front=0;
}

bool QueueEmpty(SqQueue Q){
	if(Q.rear==Q.front)
		return true;
	else
		return false;
}

//入队
bool EnQueue(SqQueue &Q,ElemType x){
	if((Q.rear+1)%MaxSize==Q.front) 
		return false; //队满时报错
	Q.data[Q.rear]=x; //将x插入队尾
	Q.rear=(Q.rear+1)%MaxSize;  //队尾指针后移
	return true;
}

bool DeQueue(SqQueue &Q,ElemType &x){
	if(Q.rear==Q.front) //判断队空
		return false; //队空则报错
	x=Q.data[Q.front];
	Q.front=(Q.front+1)%MaxSize; //队头指针后移
	return true;
}

bool GetHead(SqQueue Q,ElemType &x){
	if(Q.rear==Q.front)
		return false;  //队空则报错
	x=Q.data[Q.front];
	return true;
}

void main(){
	ElemType x;
	SqQueue q;
	InitQueue(q);
	EnQueue(q,5);
	EnQueue(q,3);
	EnQueue(q,4);
	DeQueue(q,x);

}

你可以建立一个cpp文件将这段代码copy进去,来方便后面的学习。

 

打开VC++并打开项目

找到vc++,右击,选择以管理员方式打开vc++。

打开后选择菜单,打开你的C++项目的工作空间。

 

调试

编译项目

首先我们先将项目编译一下

加断点

比如我们可以在EnQueue(q,4)前面加一个断点:

调试

下面我们点击如图的按键启动调试:

启动调试成功:

调试工具箱

下面我们来调出调试工具箱:

调试工具箱可以方便地控制我们的调试。

这里我们主要用到:

  • Variables:查看变量情况
  • Memory:查看内存情况

 

程序分析

下面我们来一步步地程序分析。

我们的程序是一个顺序队列程序,即数据以先进先出的方式保存在一个结构体的数组中。

分析我们的主函数:

void main(){
	ElemType x;
	SqQueue q;
	InitQueue(q);
	EnQueue(q,5);
	EnQueue(q,3);
	EnQueue(q,4);
	DeQueue(q,x);
}

定义个队列,并将其初始化(rear尾指针和front头指针设置为0),给队列放入5、3两个元素,然后被断点打断。

下面我们通过variables得到data的地址,然后在memory中查看内存结构:

然后我们就可以看到内存信息:

FEFC到FF23的内容就是结构体中的data部分,后面挨着的四个字节就是front,再后面挨着的四个字节就是rear(插入了两个元素已经变成2了)。

再后面的四个字节是我们定义的x,因为没有赋初值所以现在是CCH。

是否好奇,为什么我们先定义的x,后定义的结构体q,但是x却在高位,q在x的低位呢?

因为我们的变量是定义在内存的栈区,所以先定义的在高位,后定义的低位。

我们执行下面的两条C语句(再插入4、弹出队尾元素给x),做个动态图给各位看看,具体的内存变化原理我就不啰嗦了:

 

 

 


经验教训

管理员权限

如果你是win7、win10的系统,需要以管理员权限打开vc,否则在调试过程中单步运行时就会报错:

Administrator privileges required for ole remote procedure call debugging :this feature will not wor

正确结束调试

调试结束后必须正确地结束调试:

 

 

 

 


 

 

 

 

商业转载 请联系作者获得授权,非商业转载 请标明出处,谢谢

发表评论

邮箱地址不会被公开。 必填项已用*标注