zoukankan      html  css  js  c++  java
  • 容器元素增删内存变化浅析

    前言

    STL的容器模板类在添加元素的时候,采用拷贝构造,并且是浅拷贝,而不是直接传递指针,这意味这系统要多开辟一块内存来满足容器的使用。如果要正确使用STL容器对各种对象操作要注意重载拷贝构造函数,也就是变成深拷贝

    使用细节

    测试代码使用到了vector向量,而每次他都调用当前元素相应个数的析构以及拷贝构造。这其中的原因是vector初始化大小为1,然后每次添加元素进去它都会改变大小来满足元素个数的需要,而当添加到第三个的时候它大小直接开辟两个,后面变为4个(如例输出)。这就和数据结构中顺序表具体操作有关,大胆猜测一下这个大小当到达某个阈值时就会线性增加,而不会翻倍


    测试代码

    #include <iostream>
    #include <fstream>
    #include <cstring>
    #include <vector>
    using namespace std;
    
    class STL_Test{
    public:
    	char *str;
    	
    public:
    	STL_Test():str(NULL){
    		cout << "构造函数调用" << endl;
    	}
    	STL_Test(const STL_Test &cd)
    	{
    		cout << "拷贝函数调用 " << endl;
    		this->str = new char[strlen(cd.str)+1];
    		strcpy(str, cd.str);
    	}
    
    	~STL_Test(){
    		if(str){
    			cout << "析构函数调用,str不为null" << endl;
    			delete[] str;
    		}else {
    			cout << "析构函数" << endl;
    		}
    	}
    };
    
    int main()
    {
    	vector <STL_Test> a2;// = new vector <STL_Test>();
    	vector <STL_Test> *a1 = &a2;
    	a1 -> reserve(1);
    	cout << "容器大小: " << a1 -> capacity() << endl;
    
    	STL_Test d1;
    	d1.str = new char[32];
    	strcpy(d1.str, "copy1");
    	cout << "---------------------------------" << endl;
    	a1->push_back(d1);
    	cout << "---------------------------------" << endl;
    	
    	STL_Test d2;
    	d2.str = new char[32];
    	strcpy(d2.str, "copy2");
    	cout << "---------------------------------" << endl;
    	cout << a1 <<endl;
    	a1->push_back(d2);
    	cout << "容器大小: " << a1 -> capacity() << endl;
    	cout << a1 <<endl;
    	cout << "---------------------------------" << endl;
    	
    	STL_Test d3;
    	d3.str = new char[32];
    	strcpy(d3.str, "copy3");
    	cout << "---------------------------------" << endl;
    	cout << a1 <<endl;
    	(*a1).push_back(d3);
    	cout << "容器大小: " << a1 -> capacity() << endl;
    	cout << a1 <<endl;
    	cout << "---------------------------------" << endl;
    	
    	STL_Test d4;
    	d4.str = new char[32];
    	strcpy(d4.str, "copy4");
    	cout << "---------------------------------" << endl;
    	cout << a1 <<endl;
    	a2.push_back(d4);
    	a2.push_back(d4);
    	cout << "容器大小: " << a2.capacity() << endl;
    	cout << a1 <<endl;
    	cout << "---------------------------------" << endl;
    	
    //	delete a1;这里删除a2栈内存空间,让程序不能正常结束
    
    	return 0;
    }
    
    
  • 相关阅读:
    php中curl类常用方法封装和详解
    一个简单的PHP的CURL类
    PHP的curl常用的5个例子
    PHP封装CURL扩展
    马老师的WoTou生产消费线程讲解例子
    URL路径设置----第二章:创建和管理内容
    浅谈js设计模式之迭代器模式
    浅谈js设计模式之代理模式
    浅谈js设计模式之策略模式
    浅谈js设计模式之单例模式
  • 原文地址:https://www.cnblogs.com/caczhtus/p/10350828.html
Copyright © 2011-2022 走看看