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

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

*/
#include <iostream>
#include <string>
#include <list> #include <windows.h> 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;
} CData(const CData &data)
{
this->sequence = data.sequence;
this->remark = data.remark; cout << "CData(const CData &data)\t" << toString() << "\t" << this << endl;
} CData operator = (const CData &data)
{
this->sequence = data.sequence;
this->remark = data.remark; cout << "CData operator = (const CData &data)\t" << toString() << "\t" << this << endl; return *this;
} 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";
CData data1(, str);
CData data2(, str);
CData data3(, str);
CData data4(, str);
CData data5(, str);
CData data6(, str);
CData data7(, str);
CData data8(, str);
CData data9(, str);
CData data10(, str); cout << "push CData to list" << endl;
list<CData> lst_data;
cout << "max size of list<CData> is " << lst_data.max_size() << endl;
cout << "size of list<CData> is " << lst_data.size() << endl; cout << "****************lst_data.push_back(data1)" << endl;
lst_data.push_back(data1);
Sleep( * lst_data.size()); cout << "****************lst_data.push_back(data2)" << endl;
lst_data.push_back(data2);
Sleep( * lst_data.size()); cout << "****************lst_data.push_back(data3)" << endl;
lst_data.push_back(data3);
Sleep( * lst_data.size()); cout << "****************lst_data.push_back(data4)" << endl;
lst_data.push_back(data4);
Sleep( * lst_data.size()); cout << "****************lst_data.push_back(data5)" << endl;
lst_data.push_back(data5);
Sleep( * lst_data.size()); cout << "****************lst_data.push_back(data6)" << endl;
lst_data.push_back(data6);
Sleep( * lst_data.size()); cout << "****************lst_data.push_back(data7)" << endl;
lst_data.push_back(data7);
Sleep( * lst_data.size()); cout << "****************lst_data.push_back(data8)" << endl;
lst_data.push_back(data8);
Sleep( * lst_data.size()); cout << "****************lst_data.push_back(data9)" << endl;
lst_data.push_back(data9);
Sleep( * lst_data.size()); cout << "****************lst_data.push_back(data10)" << endl;
lst_data.push_back(data10);
Sleep( * lst_data.size()); // 程序到此为止,可以看到在每次push的时候,对象的复制构造函数会调用一次。
cout << "===============show list by iterator" << endl;
for (list<CData>::iterator itr = lst_data.begin(); itr != lst_data.end(); itr++)
{
// 显示的地址信息,是每次push的时候所复制的对象的地址。
cout << "address of itr is " << &(*itr) << "\tvalue is " << itr->toString() << endl;
} cout << "===============clear list 1" << endl;
// list中的元素不是指针,此处的清理,会调用析构函数。
lst_data.clear(); cout << "======================end of process" << endl; return ;
}

程序的结果:
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. Python基础(14)_python模块之configparser模块、suprocess

    9.configparser模块 模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值). 常见的软件格式文档格式如下: [D ...

  2. 浅谈HTTPS协议

    前言 理解协议是做接口测试的前提.本文主要向大家展示博主对HTTPS协议的理解,网上有诸多资料,有些写得过于晦涩难懂,尤其是需要密码学的一些知识.我做了一下简单的整理,刨除复杂的底层实现,单从理解SS ...

  3. jQuery开发入门

    jQuery是JavaScript库中的优秀一员. 下载完jQuery框架文件jquery-1.9.0.js 后,不需要任何安装,仅需使用<script>文件导入标记,将该框架文件导入页面 ...

  4. SpringBoot2.1.0 application.properties配置

    # =================================================================== # COMMON SPRING BOOT PROPERTIE ...

  5. UVA11297 Census

    题目 UVA11297 Census 做法 二维线段树,单点修改,矩阵查询,树套树(\(x,y\)),维护最大值最小值废话 有一点要注意的是:\(x\)树传到\(y\)树里面修改的时候,如果\(x\) ...

  6. accept= 'image/*'反映缓慢

    input[type='file']的accept属性用来指定上传文件的MIME类型. 将其设为accept= 'image/*',顾名思义,过滤掉所有非图片文件, 但在实际操作中,发现有时会出现响应 ...

  7. 20165101刘天野 2017-2018-2 《Java程序设计》第3周学习总结

    20165101刘天野 2017-2018-2 <Java程序设计>第3周学习总结 编程语言的几个发展阶段 类 构造方法与对象的创建 类与程序的基本结构 参数传值 对象的组合 实例成员与类 ...

  8. mongod无法启动

    今天遇到了一个奇葩问题,我在Linux系统里备份了数据库,结果不知道为什么,系统用不了了,后来经过同事的检查,发现原来是我的硬盘快满了,导致mongod数据无法启动,真是.......

  9. 解决可以Ping通ip地址,但Ping不通域名的思路

    在正常的网络故障处理中,ping命令是大家经常用到的,出现ping通ip地址,但ping域名是出现超时情况,一般是由于TCP/IP协议中的“DNS设置”不正确,请检查其中的配置,或者更换其他可用的DN ...

  10. setintervalue传参数的三种方法

    http://www.cnblogs.com/wkylin/archive/2012/09/07/2674911.html http://www.bhcode.net/article/20110822 ...