如何解决向容器里压入类的对象,但类的对象被析构的问题
来源:互联网 发布:多益网络招聘坑人 编辑:程序博客网 时间:2024/05/22 03:26
当需要用vector以及map等容器存储一些类的对象时,如果这个类里数据成员有一些new出来的指针,那么当你压入这个对象时有可能里面的指针就被析构掉了。
如果你压入的是这个对象的指针,但是由于这个指针指向的是这个对象的地址,如果这个对象发生了变化,原先压入的对象也会发生相应的变化。
以下是一些错误的做法
voronoicell c;map<int, voronoicell*> cells_1;map<int, voronoicell> cells_2;while (1){compute_cell(c);*cell_temp = c;cells_1.insert(make_pair(cell_id,cell_temp));cells_2.insert(make_pair(cell_id,c));}voronoicell是一个类,里面有的数据成员是new出来的,即动态分配内存的。
以上第一个做法是压入c的指针,但是进入下一个循环的时候,如果c的数据成员发生改变,cells_1中先前压入的c的指针也会发生相应的变化。所以无效!
第二个做法是压入c本身,但是map等STL容器在压入新的对象的时候,如果原先的空间不够的话,map会new出一个新的空间,把原来的数据成员拷贝出来,放到那个新的空间里,再把原来的空间析构掉。但是原来的空间保存了原先数据成员(那个new出来的指针)的地址,如果被析构掉的话,新空间里面的数据成员将指向一个无效的地址。那么c里面的那些动态分配的数据成员将全部无效。
正确的做法是new出来一个空间,来存储一个临时的变量,将c赋值到这个空间的临时变量里(这个new出来的空间如果你自己不手动析构,程序将不会将其析构掉)。再将这个new出来的空间里的变量压入到容器里面。
以下是正确的做法:
voronoicell *cell_temp = new voro::voronoicell[1];*cell_temp = c;cells_1.insert(make_pair(cell_id,cell_temp));
- 如何解决向容器里压入类的对象,但类的对象被析构的问题
- STL:如何理解容器对象的比较
- 几何画板中对象标签的问题如何解决
- 一个类中静态容器对象的初始化问题
- 一个类中静态容器对象的初始化问题
- 一个类中静态容器对象的初始化问题
- 子类对象向父类对象转换的相关问题解析
- 面向对象--多继承&派生类对象内存布局分析&各基类指针所指向的位置分析(解决面试宝典第四版P147问题)
- 基于对象和面向对象的区别
- 基于对象和面向对象的区别
- 基于对象和面向对象的区别
- 基于对象和面向对象的区别
- 对面向对象的理解及应该了解的问题
- spring容器对象的生命周期
- 容器内对象的排序
- 对面向对象的认识
- 对面向对象的评论
- 对面向对象的理解
- Hibernate保存数据自动生成主键出现奇怪异常Duplicate entry '0' for key 1
- 《Windows下Git的使用》
- linux和AIX下抓包的方法
- 转载——c# 大批量数据导出到excel[此为个人分享] [问题点数:20分,结帖人rocket2010]
- 短信发送器2
- 如何解决向容器里压入类的对象,但类的对象被析构的问题
- 几个经典递归问题(放苹果,红与黑,八皇后,木棍)
- hadoop 各个版本下载地址
- Service Broker的基本概念及建立一个Service Broker应用程序的基本步骤
- Android中的onConfigurationChanged方法没有被调用的原因
- 大数乘法
- Python基本类型与引用类型
- 《unix网络编程》套接字选项
- 不同浏览器对 的兼容