该程序演示了list在内存分配时候的问题。里面的备注信息是我的想法。

  1. /*
  2. 功能说明:
  3. list的内存分配机制分析。
  4. 代码说明:
  5. list所管理的内存地址可以是不连续的。程序在不断的push_back的过程中,程序仅会将操作的元素进行复制一份,保存到list中。通过复制构造函数和析构函数,可以看到这些操作。
  6. 实现方式:
  7.  
  8. 限制条件或者存在的问题:

  9. */
  10. #include <iostream>
  11. #include <string>
  12. #include <list>
  13.  
  14. #include <windows.h>
  15.  
  16. using namespace std;
  17.  
  18. class CData
  19. {
  20. public:
  21. CData()
  22. {
  23. sequence = ;
  24. this->remark = "default string";
  25.  
  26. cout << "CData()\t" << toString() << "\t" << this << endl;
  27. }
  28.  
  29. CData(int i, string &s)
  30. {
  31. this->sequence = i;
  32. this->remark = s;
  33.  
  34. cout << "CData(int i,string &s)\t" << toString() << "\t" << this << endl;
  35. }
  36.  
  37. CData(const CData &data)
  38. {
  39. this->sequence = data.sequence;
  40. this->remark = data.remark;
  41.  
  42. cout << "CData(const CData &data)\t" << toString() << "\t" << this << endl;
  43. }
  44.  
  45. CData operator = (const CData &data)
  46. {
  47. this->sequence = data.sequence;
  48. this->remark = data.remark;
  49.  
  50. cout << "CData operator = (const CData &data)\t" << toString() << "\t" << this << endl;
  51.  
  52. return *this;
  53. }
  54.  
  55. void setSequence(const int i)
  56. {
  57. this->sequence = i;
  58. }
  59.  
  60. void setRemark(const string &s)
  61. {
  62. this->remark = s;
  63. }
  64.  
  65. string toString() const
  66. {
  67. char tmp[] = { };
  68. sprintf(tmp, "[sequence:%d | remark:%s]", this->sequence, this->remark.c_str());
  69.  
  70. //此处应该有内存复制操作,所以不用担心返回后tmp数组所指向的内存被修改或者不存在的情况。
  71. return tmp;
  72. }
  73.  
  74. ~CData()
  75. {
  76. cout << "~CData()\t" << this << endl;
  77. }
  78. protected:
  79. private:
  80. int sequence;
  81. string remark;
  82. };
  83.  
  84. int main(int argc, char **argv)
  85. {
  86. cout << "process begin at " << (void*)&main << endl;
  87.  
  88. string str = "baby_test";
  89. CData data1(, str);
  90. CData data2(, str);
  91. CData data3(, str);
  92. CData data4(, str);
  93. CData data5(, str);
  94. CData data6(, str);
  95. CData data7(, str);
  96. CData data8(, str);
  97. CData data9(, str);
  98. CData data10(, str);
  99.  
  100. cout << "push CData to list" << endl;
  101. list<CData> lst_data;
  102. cout << "max size of list<CData> is " << lst_data.max_size() << endl;
  103. cout << "size of list<CData> is " << lst_data.size() << endl;
  104.  
  105. cout << "****************lst_data.push_back(data1)" << endl;
  106. lst_data.push_back(data1);
  107. Sleep( * lst_data.size());
  108.  
  109. cout << "****************lst_data.push_back(data2)" << endl;
  110. lst_data.push_back(data2);
  111. Sleep( * lst_data.size());
  112.  
  113. cout << "****************lst_data.push_back(data3)" << endl;
  114. lst_data.push_back(data3);
  115. Sleep( * lst_data.size());
  116.  
  117. cout << "****************lst_data.push_back(data4)" << endl;
  118. lst_data.push_back(data4);
  119. Sleep( * lst_data.size());
  120.  
  121. cout << "****************lst_data.push_back(data5)" << endl;
  122. lst_data.push_back(data5);
  123. Sleep( * lst_data.size());
  124.  
  125. cout << "****************lst_data.push_back(data6)" << endl;
  126. lst_data.push_back(data6);
  127. Sleep( * lst_data.size());
  128.  
  129. cout << "****************lst_data.push_back(data7)" << endl;
  130. lst_data.push_back(data7);
  131. Sleep( * lst_data.size());
  132.  
  133. cout << "****************lst_data.push_back(data8)" << endl;
  134. lst_data.push_back(data8);
  135. Sleep( * lst_data.size());
  136.  
  137. cout << "****************lst_data.push_back(data9)" << endl;
  138. lst_data.push_back(data9);
  139. Sleep( * lst_data.size());
  140.  
  141. cout << "****************lst_data.push_back(data10)" << endl;
  142. lst_data.push_back(data10);
  143. Sleep( * lst_data.size());
  144.  
  145. // 程序到此为止,可以看到在每次push的时候,对象的复制构造函数会调用一次。
  146. cout << "===============show list by iterator" << endl;
  147. for (list<CData>::iterator itr = lst_data.begin(); itr != lst_data.end(); itr++)
  148. {
  149. // 显示的地址信息,是每次push的时候所复制的对象的地址。
  150. cout << "address of itr is " << &(*itr) << "\tvalue is " << itr->toString() << endl;
  151. }
  152.  
  153. cout << "===============clear list 1" << endl;
  154. // list中的元素不是指针,此处的清理,会调用析构函数。
  155. lst_data.clear();
  156.  
  157. cout << "======================end of process" << endl;
  158.  
  159. return ;
  160. }

程序的结果:
process begin at 00B01749
CData(int i,string &s)  [sequence:1 | remark:baby_test] 010FFCF8
CData(int i,string &s)  [sequence:2 | remark:baby_test] 010FFCD0
CData(int i,string &s)  [sequence:3 | remark:baby_test] 010FFCA8
CData(int i,string &s)  [sequence:4 | remark:baby_test] 010FFC80
CData(int i,string &s)  [sequence:5 | remark:baby_test] 010FFC58
CData(int i,string &s)  [sequence:6 | remark:baby_test] 010FFC30
CData(int i,string &s)  [sequence:7 | remark:baby_test] 010FFC08
CData(int i,string &s)  [sequence:8 | remark:baby_test] 010FFBE0
CData(int i,string &s)  [sequence:9 | remark:baby_test] 010FFBB8
CData(int i,string &s)  [sequence:10 | remark:baby_test]        010FFB90
push CData to list
max size of list<CData> is 107374182
size of list<CData> is 0
****************lst_data.push_back(data1)
CData(const CData &data)        [sequence:1 | remark:baby_test] 01176A58
****************lst_data.push_back(data2)
CData(const CData &data)        [sequence:2 | remark:baby_test] 0117C7E8
****************lst_data.push_back(data3)
CData(const CData &data)        [sequence:3 | remark:baby_test] 0117C840
****************lst_data.push_back(data4)
CData(const CData &data)        [sequence:4 | remark:baby_test] 0117DE90
****************lst_data.push_back(data5)
CData(const CData &data)        [sequence:5 | remark:baby_test] 0117DEE8
****************lst_data.push_back(data6)
CData(const CData &data)        [sequence:6 | remark:baby_test] 0117DF40
****************lst_data.push_back(data7)
CData(const CData &data)        [sequence:7 | remark:baby_test] 0117E018
****************lst_data.push_back(data8)
CData(const CData &data)        [sequence:8 | remark:baby_test] 0117E1D0
****************lst_data.push_back(data9)
CData(const CData &data)        [sequence:9 | remark:baby_test] 0117E598
****************lst_data.push_back(data10)
CData(const CData &data)        [sequence:10 | remark:baby_test]        0117E540
===============show list by iterator
address of itr is 01176A58      value is [sequence:1 | remark:baby_test]
address of itr is 0117C7E8      value is [sequence:2 | remark:baby_test]
address of itr is 0117C840      value is [sequence:3 | remark:baby_test]
address of itr is 0117DE90      value is [sequence:4 | remark:baby_test]
address of itr is 0117DEE8      value is [sequence:5 | remark:baby_test]
address of itr is 0117DF40      value is [sequence:6 | remark:baby_test]
address of itr is 0117E018      value is [sequence:7 | remark:baby_test]
address of itr is 0117E1D0      value is [sequence:8 | remark:baby_test]
address of itr is 0117E598      value is [sequence:9 | remark:baby_test]
address of itr is 0117E540      value is [sequence:10 | remark:baby_test]
===============clear list 1
~CData()        01176A58
~CData()        0117C7E8
~CData()        0117C840
~CData()        0117DE90
~CData()        0117DEE8
~CData()        0117DF40
~CData()        0117E018
~CData()        0117E1D0
~CData()        0117E598
~CData()        0117E540
======================end of process
~CData()        010FFB90
~CData()        010FFBB8
~CData()        010FFBE0
~CData()        010FFC08
~CData()        010FFC30
~CData()        010FFC58
~CData()        010FFC80
~CData()        010FFCA8
~CData()        010FFCD0
~CData()        010FFCF8

list的内存分配机制分析的更多相关文章

  1. map的内存分配机制分析

    该程序演示了map在形成的时候对内存的操作和分配. 因为自己对平衡二叉树的创建细节理解不够,还不太明白程序所显示的日志.等我明白了,再来修改这个文档. /* 功能说明: map的内存分配机制分析. 代 ...

  2. vector的内存分配机制分析

    该程序初步演示了我对vector在分配内存的时候的理解.可能有误差,随着理解的改变,改代码可以被修改. /* 功能说明: vector的内存分配机制分析. 代码说明: vector所管理的内存地址是连 ...

  3. memcached学习——memcached的内存分配机制Slab Allocation、内存使用机制LRU、常用监控记录(四)

    内存分配机制Slab Allocation 本文参考博客:https://my.oschina.net/bieber/blog/505458 Memcached的内存分配是以slabs为单位的,会根据 ...

  4. Keil C动态内存管理机制分析及改进(转)

    源:Keil C动态内存管理机制分析及改进 Keil C是常用的嵌入式系统编程工具,它通过init_mempool.mallloe.free等函数,提供了动态存储管理等功能.本文通过对init_mem ...

  5. 阿里面试官:小伙子,你给我说一下JVM对象创建与内存分配机制吧

    内存分配机制   逐步分析 类加载检查: 虚拟机遇到一条new指令(new关键字.对象的克隆.对象的序列化等)时,会先去检查这个指令的参数在常量池中定位到一个类的符号引用,并且这个符号引用代表的类是否 ...

  6. JVM的艺术-对象创建与内存分配机制深度剖析

    JVM的艺术-对象创建与内存分配机制深度剖析 引言 本章将介绍jvm的对象创建与内存分配.彻底带你了解jvm的创建过程以及内存分配的原理和区域,以及包含的内容. 对象的创建 类加载的过程 固定的类加载 ...

  7. Go语言内存分配机制

    前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请 ...

  8. Memcache简介 & 内存分配机制

            关于这个东西里面到底应该存放数据网上一直有很多种说法,有的说sql进行md5之后作为键值,结果作为内容存放,也有人说按照业务逻辑错放,反正是炒的不亦乐乎.        本人经过将近2 ...

  9. SQL Server ->> Memory Allocation Mechanism and Performance Analysis(内存分配机制与性能分析)之 -- Minimum server memory与Maximum server memory

    Minimum server memory与Maximum server memory是SQL Server下配置实例级别最大和最小可用内存(注意不等于物理内存)的服务器配置选项.它们是管理SQL S ...

随机推荐

  1. C#使用Lock访问共享数据的问题

    lock 语句(C# 参考) lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁.此语句的形式如下: 复制 Object thisLock = new Objec ...

  2. Mac 远程连接 Windows 系统无法全屏

    远程连接之后,Mac 工具栏中 配置 RDC 下 “首选项”. “显示” ----远程桌面大小:全屏 ----打开远程桌面窗口:第二显示器(我用的是双显示器,根据实际情况设定显示器) 配置完成后,点击 ...

  3. LeetCode:数据库技术【175-178】

    LeetCode:数据库技术[175-178] LeetCode已经刷完200道题目,但这只是开始,下一段时间,仍然把刷题作为重点,争取再次完成200道,本篇博客将会带大家熟悉一些数据库面试题,从简单 ...

  4. CentOS 6.4下OpenSSH升级到6.7操作

    一.升级前准备 1.下载openssh-6.7p1.tar.gz: cd /usr/local/src/wget http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/ ...

  5. c# 虚方法(virtual)与 多态(Polymorphism)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; //虚方法(virtual) ...

  6. springboot-数据库

    Spring-data-jpa jpa定义了一系列持久化的标准,比如hibernate就实现了这一标准. Springboot 的jpa就是hibernate的整合. 在pom文件中增加配置: < ...

  7. 3D图形学理论入门指南

    转:http://gad.qq.com/article/detail/35096 介绍         当我还小的时候,我曾以为计算机图形学是最酷的玩意儿.但是随即我认识到,学习图形学——创建那些超级 ...

  8. java常用日期操作方法

    package com.wujiangpo.test.util; import java.text.ParseException; import java.text.SimpleDateFormat; ...

  9. explicit c++

    C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况 ...

  10. 解决MySQL因不能创建 PID 导致无法启动的方法

    问题描述 MySQL 启动报错信息如下: ? 1 2 Starting mysqld (via systemctl):  Job for mysqld.service failed because t ...