该程序演示了vector中的元素为指针的时候的对对象的操作。

  1. /*
  2. 功能说明:
  3. 元素为指针的vector的使用说明
  4. 实现方式:
  5. 使用this成员来显示各个对象的地址。
  6. 限制条件或者存在的问题:

  7. */
  8. #include <iostream>
  9. #include <string>
  10. #include <vector>
  11.  
  12. using namespace std;
  13.  
  14. class CData
  15. {
  16. public:
  17. CData()
  18. {
  19. sequence = ;
  20. this->remark = "default string";
  21.  
  22. cout << "CData()\t" << toString() <<"\t"<< this << endl;
  23. }
  24.  
  25. CData(int i,string &s)
  26. {
  27. this->sequence = i;
  28. this->remark = s;
  29.  
  30. cout << "CData(int i,string &s)\t" << toString() << "\t" << this << endl;
  31. }
  32.  
  33. void setSequence(const int i)
  34. {
  35. this->sequence = i;
  36. }
  37.  
  38. void setRemark(const string &s)
  39. {
  40. this->remark = s;
  41. }
  42.  
  43. string toString() const
  44. {
  45. char tmp[] = { };
  46. sprintf(tmp, "[sequence:%d | remark:%s]", this->sequence, this->remark.c_str());
  47.  
  48. //此处应该有内存复制操作,所以不用担心返回后tmp数组所指向的内存被修改或者不存在的情况。
  49. return tmp;
  50. }
  51.  
  52. ~CData()
  53. {
  54. cout << "~CData()\t" << this << endl;
  55. }
  56. protected:
  57. private:
  58. int sequence;
  59. string remark;
  60. };
  61.  
  62. int main(int argc, char **argv)
  63. {
  64. cout << "process begin at " << (void*)&main << endl;
  65.  
  66. string str = "baby test";
  67. // 查看保存在系统的栈中的对象的地址。
  68. cout << "==========test class object in stack" << endl;
  69. CData data1;
  70. cout << "address of object in stack:" << &data1 << "\tdefalut object elements:" << data1.toString() << endl;
  71. data1.setSequence();
  72. data1.setRemark(str);
  73. cout << "address of object in stack:" << &data1 << "\tafter set object elements:" << data1.toString() << endl;
  74.  
  75. // 查看保存在系统的堆中的对象的地址。这种对象需要手工删除,否则会造成内存泄露
  76. cout << "\n==========test class object in heap" << endl;
  77. CData *p_data12 = new CData(, str); // 带有参数的构造函数的第二个参数为一个地址,所以,此处的调用必须为一个对象。不能是一个字符数组。
  78. 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;
  79.  
  80. CData *p_data13 = new CData(, str);
  81. 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;
  82.  
  83. cout << "\n==========vector test. object in heap" << endl;
  84. vector<CData*> vec_data;
  85. vec_data.push_back(p_data12);
  86. vec_data.push_back(p_data13);
  87. vec_data.push_back(p_data12);
  88. vec_data.push_back(p_data13);
  89. // 上述操作完成之后,堆中有2个对象,但是,这两个对象分别有3个指针来指向他。一个是原始的创建对象的时候的。另外两个是上面的push_back所复制的。
  90. cout << "show vector's msg" << endl;
  91. for (int i = ; i < vec_data.size(); i++)
  92. {
  93. // 查看vector元素的地址,说明,vector中的元素的位置是连续的。
  94. cout << "address of element in vector:" << &(vec_data[i]) << endl;
  95. CData *pTmp = vec_data[i];
  96. cout << "object address in heap:" << pTmp << "\tobject msg in heap:" << (pTmp)->toString() << endl;
  97. }
  98.  
  99. vec_data.clear();
  100. // 清理掉vector中的元素。也仅是清理掉vector中的指向对象的指针,并没有清理掉这些指针所指向的对象。另外,其原始的指向对象的指针还是存在的。
  101. cout << "\n==========check objects in heap after clear vector" << endl;
  102. cout << "address of class object in heap:" << p_data12 << "\tobject in heap:" << p_data12->toString() << endl;
  103. cout << "address of class object in heap:" << p_data13 << "\tobject in heap:" << p_data13->toString() << endl;
  104.  
  105. cout << "\n==========delete object in heap using vector iterator" << endl;
  106. // 再将两个对象的指针复制到vector中。
  107. vec_data.push_back(p_data12);
  108. vec_data.push_back(p_data13);
  109. for (vector<CData*>::iterator itr = vec_data.begin(); itr != vec_data.end(); itr++)
  110. {
  111. // 通过迭代器来删除每个指针指向的对象。如果vector中的多个元素指向了同一个对象(上面的情形),此处的程序会异常退出。
  112. cout <<"delete object:" << *itr << endl;
  113. delete *itr;
  114. *itr = ;
  115. }
  116.  
  117. // 清理vector元素中的指针所指向的对象。并不意味着去清理了vector本身,所以,其长度还是原来的数值。
  118. cout << "vector length is " << vec_data.size() << endl;
  119. cout << "\n==========check objects in heap using vector after delete objects" << endl;
  120. for (vector<CData*>::iterator itr = vec_data.begin(); itr != vec_data.end(); itr++)
  121. {
  122. // vecotr中的指针已经在上面被修改,这里是查看一下。
  123. cout << "address of object in heap:" << *itr << endl;
  124. }
  125.  
  126. vec_data.clear();
  127.  
  128. cout << "\n==========check objects in heap using original pointer after delete objects" << endl;
  129. // 上面的vector中,已经删除的堆中的对象。所以下面的对象的toString()操作将是错误的。使用此函数,会导致程序异常退出。
  130. //cout << "address of class object in heap:" << p_data12 << "\tobject in heap:" << p_data12->toString() << endl;
  131. //cout << "address of class object in heap:" << p_data13 << "\tobject in heap:" << p_data13->toString() << endl;
  132.  
  133. // 上面的vector中,已经删除了堆中的对象。但是原始的指向对象的指针还是存在的,只不过是其指向的内存已经无效。
  134. cout << "address of class object in heap:" << p_data12 << endl;
  135. cout << "address of class object in heap:" << p_data13 << endl;
  136.  
  137. // 此处相当于去删除一个无效的堆的对象,会导致程序异常退出。
  138. //delete p_data12;
  139. //delete p_data13;
  140.  
  141. // 其所指向的对象已经在vector中删除,所以需要将其指向的地址清理掉,防止错误。
  142. p_data12 = ;
  143. p_data13 = ;
  144.  
  145. cout << "process end " << (void*)&main << endl;
  146.  
  147. // 程序退出前,会自动清理掉栈中的对象。
  148.  
  149. return ;
  150. }

程序的输出结果:

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的使用说明的更多相关文章

  1. 小猪猪C++笔记基础篇(四)数组、指针、vector、迭代器

    小猪猪C++笔记基础篇(四) 关键词:数组,Vector. 一.数组与指针 数组相信大家学过C语言或者其他的语言都不陌生,简单的就是同一个变量类型的一组数据.例如:int a[10],意思就是从a开始 ...

  2. [C++程序设计]指向数组元素的指针

    如果先使p指向数组a的首元素(即p=a),则: (1) p++(或p+=1).使p指向下一元素,即a[1]. 如果用*p,得到下一个元素a[1]的值. (2) *p++.由于++和*同优先级,结合方向 ...

  3. 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 ...

  4. 【C语言】12-指向一维数组元素的指针

    一.用指针指向一维数组的元素 1 // 定义一个int类型的数组 2 int a[2]; 3 4 // 定义一个int类型的指针 5 int *p; 6 7 // 让指针指向数组的第0个元素 8 p ...

  5. 【C语言】指向一维数组元素的指针

    本文目录 一.用指针指向一维数组的元素 二.用指针遍历数组元素 三.指针与数组的总结 四.数组.指针与函数参数 前面我们已经学习了指针,如果指针存储了某个变量的地址,我们就可以说指针指向这个变量.数组 ...

  6. C 语言:返回两个数组中第一个相同元素的指针(我用了loop 、goto loop标签)

    // //  main.c //  Pointer_search // //  Created by ma c on 15/8/2. //  要求:通过指针查找,实现比较两个有序数组中的元素,输出两个 ...

  7. C语言:返回两个数组中第一个元素的指针,并输出这个值

    // //  main.c //  Pointer_search // //  Created by ma c on 15/8/2. //  Copyright (c) 2015年. All righ ...

  8. 【C语言】-指向一维数组元素的指针

    本文目录 一.用指针指向一维数组的元素 二.用指针遍历数组元素 三.指针与数组的总结 四.数组.指针与函数参数 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能 ...

  9. 数组元素的删除 【vector】

    7-5 数组元素的删除(5 分) 完成数组元素的移动功能:假设数组有n个元素,输入一个数x,把数组的第x个位置的元素删除了,后面的元素依次前进一个位置. 重复若干次这样的删除,得到最后的结果. 输入格 ...

随机推荐

  1. 系统架构师考试——程序计数器 PC, 指令寄存器IR、状态寄存器SR、通用寄存器GR

    ● 计算机执行程序时,在一个指令周期的过程中,为了能够从内存中读指令操作码,首先是将__(9)___的内容送到地址总线上. (9)A.程序计数器PC    B.指令寄存器IR C.状态寄存器SR    ...

  2. Linux服务器操作指南

    1. linux下在某行的前一行或后一行添加内容 http://www.361way.com/sed-process-lines/2263.html

  3. Linux系统资源查询命令(cpu、io、mem)

    cpu/mem: 1. 指定pid top -p pid1,pid2,... 2. top排序 先top,然后  输入大写P,则结果按CPU占用降序排序.输入大写M,结果按内存占用降序排序. io: ...

  4. layer关闭弹窗

    一.关闭弹出窗 这是layer官网给出的帮助手册,讲解的比较详细 分成两种情况: 1.弹出层不是新的页面的时候,直接获得该弹窗的索引,然后执行close方法 layer.close(); 2.弹出窗是 ...

  5. Shell编程之IF条件

    一.if条件语句的知识与实践 1.if条件语句语法(单分支结构) 第一种: if < 条件表达式 > then 指令 fi 第二种: if < 条件表达式 >; then 指令 ...

  6. vRA7 Business error “Untrusted certificate chain”

    报错截图: 服务无法注册 第一步:登录vRB 5480页面,取消到vRA的注册 第二部:SSH登录到VRB中,查看bio-ssl.keystore.password. cat /shared/cata ...

  7. 2015 ACM/ICPC Asia Regional Changchun Online HDU 5444 Elven Postman【二叉排序树的建树和遍历查找】

    Elven Postman Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  8. 常用java开发工具快捷键

    在这里列举一些开发中常用的快捷键 常用的idea的快捷键: 1.删除当前行:Ctrl+X 2.格式化代码:Ctrl+Alt+L 3.查看本页里面的内容:Ctrl+F 4.查看类的继承方式:Ctrl+H ...

  9. 使用iframe,注销以后,点击某个标签,跳转到的登录页面位于标签中

    当使用iframe时,要么会话过期,要么手动注销,如果此时再进行操作,可能遇到跳转到登录页面,可是登录页面会位于标签执行,并没有全屏显示,即位于当前的iframe中,此时的解决方式很简单,只需要在登录 ...

  10. 关于Json如何转换成对象及获值问题!

    var result = eval('('+result+')'); result为Json 转换成var result对象,可以 if(result.success){ window.locatio ...