- 浏览: 370122 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (335)
- C++ (190)
- 设计模式 (43)
- 数据库技术 (5)
- 网络编程 (11)
- 自动化测试 (6)
- Linux (13)
- OpenSSL (10)
- MS Crypt API (5)
- SCM (2)
- English (4)
- Android (10)
- EMV规范 (1)
- Saturn Platform (0)
- C (10)
- SQL (2)
- ASP.NET (3)
- 英语口语学习 (3)
- 调试工具 (21)
- 编译技术 (5)
- UML (1)
- 项目管理 (5)
- 敏捷开发 (2)
- Http Server (6)
- 代码审查、代码分析 (5)
- 面试基础 (10)
- 重点知识 (16)
- STL (6)
- Efficient C++资料 (8)
- 数据结构和算法 (7)
- 读书笔记 (0)
- 开源项目 (4)
- 多线程 (2)
- Console App (6)
- 个人开源项目 (4)
- IBM DevelopWorks (4)
- Java (16)
- 内存泄漏相关调试和检测 (13)
- 软件测试相关技术 (2)
- C# (11)
- Apple Related (1)
- 软件测试和管理 (2)
- EMV (1)
- Python (1)
- Node.js (6)
- JavaScript (5)
- VUE (1)
- Frontend (1)
- Backend (4)
- RESTful API (3)
- Firebase (3)
最新评论
-
u013189503:
来个密码吧
[C++][Logging] 项目中写日志模块的实现 -
wyf_vc:
来个密码啊!!
[C++][Logging] 项目中写日志模块的实现
在我们所熟悉的STL中,vector有自己的一套分配策略。
1)当vector被创建的时候,vector会根据用户的设置进行分配内存;通常申请的内存空间是制定值的两倍;
2)当vector插入数据的时候,如果内存空间不足,它会自动重新申请一块内存(2倍于当前大小),然后把原来的内存内容拷贝到新的内存中区,最后在释放原来的内存空间;
3)动态释放内存就导致一个问题的出现,那就是迭代器失效,因为vector已经偷偷的把地址给换了;
所以我们使用迭代器的原则是:
(1)尽量不做写的工作;
(2)不可避免使用写工作的时候,在做完写工作的同时必须重新初始化迭代器;
这部分是测试代码:
1)当vector被创建的时候,vector会根据用户的设置进行分配内存;通常申请的内存空间是制定值的两倍;
2)当vector插入数据的时候,如果内存空间不足,它会自动重新申请一块内存(2倍于当前大小),然后把原来的内存内容拷贝到新的内存中区,最后在释放原来的内存空间;
3)动态释放内存就导致一个问题的出现,那就是迭代器失效,因为vector已经偷偷的把地址给换了;
所以我们使用迭代器的原则是:
(1)尽量不做写的工作;
(2)不可避免使用写工作的时候,在做完写工作的同时必须重新初始化迭代器;
这部分是测试代码:
typedef vector<string> NameVec; class TestForVector { public: TestForVector(unsigned int size = 5) :mSize(size>5 ? size:5) { mNameVec.reserve(size); OutPutVectorySize(string("TestForVector()")); } void insertFullItems() { string name("name"); char tmp[128]=""; OutPutVectorySize(string("insertFullItems()->begin")); for (unsigned int i = 0; i< mSize; i++) { name.clear(); _itoa(i+1, tmp, sizeof(tmp)); name.append("name "); name.append(tmp); mNameVec.push_back(name); } OutPutVectorySize(string("insertFullItems()<-end")); } void TestForInvalidVectorIterator() { NameVec::const_iterator itr = mNameVec.begin()+1;// point to the second element cout << "1)The address of itr is 0x"<< hex << &(*itr) << "context is: " << *itr << endl; OutPutVectorySize(string("TestForInvalidVectorIterator()->begin")); mNameVec.push_back(string("one more name")); OutPutVectorySize(string("TestForInvalidVectorIterator()<-end")); NameVec::const_iterator itr2 = mNameVec.begin()+1;// point to the second element cout << "2)The address of itr is 0x"<< hex << &(*itr2) << "context is: " << *itr2 << endl; //the memory of mNameVec has been re-allocated, so the context of itr has been removed //Crash cout << "3)The address of itr is 0x"<< hex << &(*itr) << "context is: " << *itr << endl; } private: void OutPutVectorySize(string funName) { cout<<"[TestForVector]:"<<funName.c_str()<<" mNameVec size = " << mNameVec.capacity() << endl; } private: NameVec mNameVec; unsigned int mSize; };
- InvalidIteratorTest.zip (4.3 KB)
- 下载次数: 0
发表评论
-
FreeRTOS
2022-03-05 16:31 248Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 412https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1330https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 477https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 574// this function create a bmp ... -
Android NDK搭建環境
2017-11-27 13:25 582https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 5738583相关资料,整理中... -
Java高级应用之JNI
2017-06-19 09:00 600参考link http://www.cnblogs.com/l ... -
C++实现ping功能
2017-04-18 11:21 2155基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 9061 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1582OpenSSL命令---rsautl http://blog. ... -
[Platform Builder] 设置SVM OS build Env
2016-11-10 11:39 01 copy one OSDesign Project to ... -
[Windows] System Error Codes(GetLastError )0-----5999
2016-10-26 13:28 1881ERROR_SUCCESS 0 (0x0) T ... -
开源Windows驱动程序框架
2016-09-17 21:35 871转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1908转自 http://blog.csdn.net/slixinx ... -
C#使用C++标准DLL实例(包含callback)
2016-09-11 19:44 1086C++编写标准Win32DLL如下 头文件 /***** ... -
C#调用C++的DLL搜集整理的所有数据类型转换方式
2016-09-09 16:07 969转自 http://www.cnblogs.com/zeroo ... -
WinCE CPU使用率计算 测试工具
2016-09-08 16:14 991转自 http://blog.csdn.net/jan ... -
switch在C++与C#中的一些差异
2016-09-08 15:19 810参考链接 http://blog.csdn.net/weiwe ... -
C++ 鼠标模拟程序
2016-09-04 12:09 1612转自 http://blog.csdn.net/weixinh ...
相关推荐
vectory是用ES6编写JavaScript向量数学库。 安装 npm install vectory-lib 使用向量,一些例子 首先,您需要加载vectory。 请注意,vectory只是lib的名称,但JavaScript类称为Vector,模块称为vector。 let Vector ...
丹佛斯VLT系列变频器是丹麦丹佛斯公司生产的工业用变频器产品,广泛应用于各种工业控制系统中。变频器的主要功能是调整电机的供电频率和电压,实现对电机速度的精确控制。在实际应用中,变频器可能会遇到各种故障...
向量这是一个管理项目,是Vue和ant-design-vue框架的基础。项目设置npm install编译和热重装以进行开发npm run serve编译并最小化生产npm run build运行测试npm run test整理和修复文件npm run lint自定义配置请参阅...
《Vector、ArrayList、List使用深入剖析》-JAVA中文站(www_java-cn_com).htm
总结一下,本压缩包提供的易语言源码实例是关于如何用易语言计算二维或三维向量长度的。通过学习和实践这个源码,用户不仅可以掌握易语言的基本编程技巧,还能巩固数学知识,为后续更复杂的算法和应用打下基础。
下面是该程序的知识点总结: 一、Java Applet基础知识 * 使用Java.applet包中的Applet类来创建一个Applet程序 * 实现Runnable接口来实现多线程编程 * 使用Thread类来创建线程 二、图形化编程基础知识 * 使用java...
基于单相H桥式逆变器拓扑,搭建了一种基于单相矢量控制的调制技术,供大家参考。