元素为指针的vector的使用说明
该程序演示了vector中的元素为指针的时候的对对象的操作。
/*
功能说明:
元素为指针的vector的使用说明
实现方式:
使用this成员来显示各个对象的地址。
限制条件或者存在的问题:
无
*/
#include <iostream>
#include <string>
#include <vector> using namespace std; class CData
{
public:
CData()
{
sequence = ;
this->remark = "default string"; cout << "CData()\t" << toString() <<"\t"<< this << endl;
} CData(int i,string &s)
{
this->sequence = i;
this->remark = s; cout << "CData(int i,string &s)\t" << toString() << "\t" << this << endl;
} void setSequence(const int i)
{
this->sequence = i;
} void setRemark(const string &s)
{
this->remark = s;
} string toString() const
{
char tmp[] = { };
sprintf(tmp, "[sequence:%d | remark:%s]", this->sequence, this->remark.c_str()); //此处应该有内存复制操作,所以不用担心返回后tmp数组所指向的内存被修改或者不存在的情况。
return tmp;
} ~CData()
{
cout << "~CData()\t" << this << endl;
}
protected:
private:
int sequence;
string remark;
}; int main(int argc, char **argv)
{
cout << "process begin at " << (void*)&main << endl; string str = "baby test";
// 查看保存在系统的栈中的对象的地址。
cout << "==========test class object in stack" << endl;
CData data1;
cout << "address of object in stack:" << &data1 << "\tdefalut object elements:" << data1.toString() << endl;
data1.setSequence();
data1.setRemark(str);
cout << "address of object in stack:" << &data1 << "\tafter set object elements:" << data1.toString() << endl; // 查看保存在系统的堆中的对象的地址。这种对象需要手工删除,否则会造成内存泄露
cout << "\n==========test class object in heap" << endl;
CData *p_data12 = new CData(, str); // 带有参数的构造函数的第二个参数为一个地址,所以,此处的调用必须为一个对象。不能是一个字符数组。
cout << "address of pointer of class object in stack:" << &p_data12 << "\taddress of class object in heap:" << p_data12 << "\tobject in heap:" << p_data12->toString() << endl; CData *p_data13 = new CData(, str);
cout << "address of pointer of class object in stack:" << &p_data13 << "\taddress of class object in heap:" << p_data13 << "\tobject in heap:" << p_data13->toString() << endl; cout << "\n==========vector test. object in heap" << endl;
vector<CData*> vec_data;
vec_data.push_back(p_data12);
vec_data.push_back(p_data13);
vec_data.push_back(p_data12);
vec_data.push_back(p_data13);
// 上述操作完成之后,堆中有2个对象,但是,这两个对象分别有3个指针来指向他。一个是原始的创建对象的时候的。另外两个是上面的push_back所复制的。
cout << "show vector's msg" << endl;
for (int i = ; i < vec_data.size(); i++)
{
// 查看vector元素的地址,说明,vector中的元素的位置是连续的。
cout << "address of element in vector:" << &(vec_data[i]) << endl;
CData *pTmp = vec_data[i];
cout << "object address in heap:" << pTmp << "\tobject msg in heap:" << (pTmp)->toString() << endl;
} vec_data.clear();
// 清理掉vector中的元素。也仅是清理掉vector中的指向对象的指针,并没有清理掉这些指针所指向的对象。另外,其原始的指向对象的指针还是存在的。
cout << "\n==========check objects in heap after clear vector" << endl;
cout << "address of class object in heap:" << p_data12 << "\tobject in heap:" << p_data12->toString() << endl;
cout << "address of class object in heap:" << p_data13 << "\tobject in heap:" << p_data13->toString() << endl; cout << "\n==========delete object in heap using vector iterator" << endl;
// 再将两个对象的指针复制到vector中。
vec_data.push_back(p_data12);
vec_data.push_back(p_data13);
for (vector<CData*>::iterator itr = vec_data.begin(); itr != vec_data.end(); itr++)
{
// 通过迭代器来删除每个指针指向的对象。如果vector中的多个元素指向了同一个对象(上面的情形),此处的程序会异常退出。
cout <<"delete object:" << *itr << endl;
delete *itr;
*itr = ;
} // 清理vector元素中的指针所指向的对象。并不意味着去清理了vector本身,所以,其长度还是原来的数值。
cout << "vector length is " << vec_data.size() << endl;
cout << "\n==========check objects in heap using vector after delete objects" << endl;
for (vector<CData*>::iterator itr = vec_data.begin(); itr != vec_data.end(); itr++)
{
// vecotr中的指针已经在上面被修改,这里是查看一下。
cout << "address of object in heap:" << *itr << endl;
} vec_data.clear(); cout << "\n==========check objects in heap using original pointer after delete objects" << endl;
// 上面的vector中,已经删除的堆中的对象。所以下面的对象的toString()操作将是错误的。使用此函数,会导致程序异常退出。
//cout << "address of class object in heap:" << p_data12 << "\tobject in heap:" << p_data12->toString() << endl;
//cout << "address of class object in heap:" << p_data13 << "\tobject in heap:" << p_data13->toString() << endl; // 上面的vector中,已经删除了堆中的对象。但是原始的指向对象的指针还是存在的,只不过是其指向的内存已经无效。
cout << "address of class object in heap:" << p_data12 << endl;
cout << "address of class object in heap:" << p_data13 << endl; // 此处相当于去删除一个无效的堆的对象,会导致程序异常退出。
//delete p_data12;
//delete p_data13; // 其所指向的对象已经在vector中删除,所以需要将其指向的地址清理掉,防止错误。
p_data12 = ;
p_data13 = ; cout << "process end " << (void*)&main << endl; // 程序退出前,会自动清理掉栈中的对象。 return ;
}
程序的输出结果:
process begin at 002D170D
==========test class object in stack
CData() [sequence:0 | remark:default string] 008FF9D8
address of object in stack:008FF9D8 defalut object elements:[sequence:0 | remark:default string]
address of object in stack:008FF9D8 after set object elements:[sequence:11 | remark:baby test]
==========test class object in heap
CData(int i,string &s) [sequence:12 | remark:baby test] 00906BB8
address of pointer of class object in stack:008FF9CC address of class object in heap:00906BB8 object in heap:[sequence:12 | remark:baby test]
CData(int i,string &s) [sequence:13 | remark:baby test] 00902F30
address of pointer of class object in stack:008FF9C0 address of class object in heap:00902F30 object in heap:[sequence:13 | remark:baby test]
==========vector test. object in heap
show vector's msg
address of element in vector:0090B8E8
object address in heap:00906BB8 object msg in heap:[sequence:12 | remark:baby test]
address of element in vector:0090B8EC
object address in heap:00902F30 object msg in heap:[sequence:13 | remark:baby test]
address of element in vector:0090B8F0
object address in heap:00906BB8 object msg in heap:[sequence:12 | remark:baby test]
address of element in vector:0090B8F4
object address in heap:00902F30 object msg in heap:[sequence:13 | remark:baby test]
==========check objects in heap after clear vector
address of class object in heap:00906BB8 object in heap:[sequence:12 | remark:baby test]
address of class object in heap:00902F30 object in heap:[sequence:13 | remark:baby test]
==========delete object in heap using vector iterator
delete object:00906BB8
~CData() 00906BB8
delete object:00902F30
~CData() 00902F30
vector length is 2
==========check objects in heap using vector after delete objects
address of object in heap:00000000
address of object in heap:00000000
==========check objects in heap using original pointer after delete objects
address of class object in heap:00906BB8
address of class object in heap:00902F30
process end 002D170D
~CData() 008FF9D8
元素为指针的vector的使用说明的更多相关文章
- 小猪猪C++笔记基础篇(四)数组、指针、vector、迭代器
小猪猪C++笔记基础篇(四) 关键词:数组,Vector. 一.数组与指针 数组相信大家学过C语言或者其他的语言都不陌生,简单的就是同一个变量类型的一组数据.例如:int a[10],意思就是从a开始 ...
- [C++程序设计]指向数组元素的指针
如果先使p指向数组a的首元素(即p=a),则: (1) p++(或p+=1).使p指向下一元素,即a[1]. 如果用*p,得到下一个元素a[1]的值. (2) *p++.由于++和*同优先级,结合方向 ...
- Go 语言中的数组是一种 值类型(不像 C/C++ 中是指向首元素的指针)
the-way-to-go_ZH_CN/07.1.md at master · Unknwon/the-way-to-go_ZH_CN https://github.com/Unknwon/the-w ...
- 【C语言】12-指向一维数组元素的指针
一.用指针指向一维数组的元素 1 // 定义一个int类型的数组 2 int a[2]; 3 4 // 定义一个int类型的指针 5 int *p; 6 7 // 让指针指向数组的第0个元素 8 p ...
- 【C语言】指向一维数组元素的指针
本文目录 一.用指针指向一维数组的元素 二.用指针遍历数组元素 三.指针与数组的总结 四.数组.指针与函数参数 前面我们已经学习了指针,如果指针存储了某个变量的地址,我们就可以说指针指向这个变量.数组 ...
- C 语言:返回两个数组中第一个相同元素的指针(我用了loop 、goto loop标签)
// // main.c // Pointer_search // // Created by ma c on 15/8/2. // 要求:通过指针查找,实现比较两个有序数组中的元素,输出两个 ...
- C语言:返回两个数组中第一个元素的指针,并输出这个值
// // main.c // Pointer_search // // Created by ma c on 15/8/2. // Copyright (c) 2015年. All righ ...
- 【C语言】-指向一维数组元素的指针
本文目录 一.用指针指向一维数组的元素 二.用指针遍历数组元素 三.指针与数组的总结 四.数组.指针与函数参数 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能 ...
- 数组元素的删除 【vector】
7-5 数组元素的删除(5 分) 完成数组元素的移动功能:假设数组有n个元素,输入一个数x,把数组的第x个位置的元素删除了,后面的元素依次前进一个位置. 重复若干次这样的删除,得到最后的结果. 输入格 ...
随机推荐
- jmeter 监控插件JMeterPlugins&PerfMon安装
下载地址:http://jmeter-plugins.org/downloads/all/ PerfMon: 用来监控Server的CPU.I/O.Memory等情况 ServerAgent-2.2. ...
- 前端基础之JavaScript_(5)_DOM对象总结
DOM 定义了访问和操作HTML文档的标准方法 访问(查找标签) //---- 直接查找 document.getElementById(“idname”) document.getElementsB ...
- 字典树 trie树 学习
一字典树 字典树,又称单词查找树,Trie树,是一种树形结构,哈希表的一个变种 二.性质 根节点不包含字符,除根节点以外的每一个节点都只包含一个字符: 从根节点到某一节点,路径上经过的字符串连接起 ...
- Archimate
archimate语言提供了一种用于表示企业体系结构的图形化语言,包括策略,转换和迁移规划,以及架构的动机和基本原理.该标准的设计尽可能紧凑,但仍可用于大多数企业体系结构建模需求.下图显示了Archi ...
- VSCode隐藏node_modules目录
使用VSCode,打开一个工程时,发现node_modules目录包含到工程中了,问题: settings.json配置如下,可以自己定制忽略的文件夹: search.exclude 用来忽略搜索的文 ...
- 九、搭建备份服务器 使用rsync服务
简介 Rsync是开源快速.多功能,可以实现全量和增量的本地或者远程数据同步备份的优秀工具.增量备份效率更高,可以同步内容也可以同步属性 [root@backup-41 ~]# rpm -qa rsy ...
- Java基础(7)-集合类3
list集合的特点 1)有序(存储和取出的元素一直) 2)可重复 List子类的特点 ArrayList 有序,可重复 底层数据结构是数组 查询快,增删慢 线程不安全,效率高 Vector 有序,可重 ...
- pandas read_sql与read_sql_table、read_sql_query 的区别
一:创建链接数据库引擎 from sqlalchemy import create_engine db_info = {'user':'user', 'password':'pwd', 'host': ...
- MATLAB一个数组中另一个数组的值
c = setdiff(a,b) 删掉素组a中数组b的元素 如:
- WPF的Presenter(ContentPresenter)
WPF的Presenter(ContentPresenter) 2010-12-20 14:34 by Clingingboy, 10619 阅读, 3 评论, 收藏, 编辑 这是2年前写了一篇文章 ...