vc调试基础知识

vc调试基础知识

ID:20260796

大小:716.00 KB

页数:63页

时间:2018-10-11

vc调试基础知识_第1页
vc调试基础知识_第2页
vc调试基础知识_第3页
vc调试基础知识_第4页
vc调试基础知识_第5页
资源描述:

《vc调试基础知识》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、VC调试基础知识目录复制构造函数和赋值操作符new,new[]和delete,delete[]解析堆栈初步认识内存管理基础(物理内存,虚拟内存,堆的关系)内存异常定位的不确定性实时调试之看懂内存实时调试之内存异常定位华生医生日志查看VC调试环境介绍转储文件(*.dmp)调试诡异现象之谜复制构造函数和赋值操作符现有网管代码中,有不少类或结构定义了复制构造函数和赋值操作符。不适当的自定义的弊端1.可维护性差,易出错,特别是当改变了成员结构,却忘记更新代码2.性能损失3.制造垃圾代码。我们是否需要自定义复制行为?复制构造函数和赋值操作符对象默认的复制行为

2、1.简单类型,直接复制。2.对象类型,调用赋值操作符,若无,采用默认复制。3.若编译器判断该对象内存结构可直接整块复制,将优化为二进制copy。类似memcpy().须自定义的场景1.存在指针,且指针是对象自身管理,对象间不共享。2.复制时要做其他特殊操作。复制构造函数和赋值操作符须自定义复制构造和赋值的场景示例:classA{public: A():m_pBuffer(NULL){}~A(){ if(m_pBuffer){ deletem_pBuffer; m_pBuffer=NULL; } }…private:char*m_pBuffer;};

3、Aa1;…Aa2=a1;new,new[]和delete,delete[]解析从几行代码开始: 1)char*p=newchar[n]; … deletep;//ordelete[]p; 2)void*p=NULL; if(xxx)newA[n];//classAelsenewB[n];//classB …deletep;//ordelete[]p;以上两段代码,两种delete方式,有何区别,哪种正确?你认为不正确的用法会引起什么问题?或者,两种都有问题?new,new[]和delete,delete[]解析对于delete对象指针问题,教科书一

4、般这样说,delete将指针当单个对象来删,而delete[]将指针当成对象数组来删(大意)。所以,我们得出结论,删除对象数组时若不加[],将会导致仅删除数组第一个元素,从而导致内存泄露。对吗?new,new[]和delete,delete[]解析为什么要设计两种delete语法?根本原因在于,C++规定删除一个对象时,必须自动调用析构函数(若有),这个责任给了编译器,而非程序员。所以删除一个对象数组,编译器必须保证调用数组每个元素的析构函数。但一个对象指针是不是数组,编译器无法知晓,必须借助于不同的语法来区分。可以看出,两种语法本质是为了“析构函

5、数”,而不是释放内存。遗漏[]并不必然导致内存泄露。new,new[]和delete,delete[]解析编译器如何识别数组个数?无标准规定,编译器自行实现。VC编译器的实现:在数组前部添加一个整型长度(4字节),存放数组长度。即,我们在分配对象数组时,返回的地址其实是向后偏移了4字节的。用delete[]时,编译器会以头部的整型为数组长度,循环调用每个元素的析构函数,然后将指针前移4字节,调用free()释放数组。由此大家应该可以看出问题,若遗漏了[],某些情况下不是内存泄露那么简单,将引起内存定位错误,程序崩溃。但事情并非绝对…new,new[

6、]和delete,delete[]解析size对象对象对象p:返回指针。。。对象数组内存结构new,new[]和delete,delete[]解析既然两种delete只是为了析构函数,当一个类没有析构函数时,还要使用上述的数组处理方式吗。没错,编译器是聪明的,它不会做不必要的无用功。当对象不存在析构函数时,delete,delete[]都等价于free(),事实上编译时就是直接转化为free()了。是否存在析构函数,并不是完全由程序员决定的。同时满足:1)程序员没有显式定义析构函数2)类中成员若有对象类型,这些成员也不存在析构函数。满足这两个条件,

7、编译器将不为此类生成析构函数,delete时也不经过析构函数这一步骤。否则,即使未显式定义,编译器也会自动生成一个。顺便提一下,构造函数也类似,若编译器判断不需要时,将不生成构造函数。new等同于malloc.new,new[]和delete,delete[]解析回头看第一页的代码,结论是不是清楚了?堆栈初步认识进程初始化时创建,大小固定默认1M,但可以用编译选项修改自底向上增长线程具有独立的堆栈,默认1M,也可以在创建线程时指定堆栈作用:分配局部变量,保存现场,传递参数堆栈初步认识猜猜看,以下代码执行结果是什么?voidmain(){inti;i

8、ntar[10];for(i=0;i<=10;i++){ar[i]=0;printf(“i=%d”,i);}}堆栈初步

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。