码迷,mamicode.com
首页 > 其他好文 > 详细

容器元素增删内存变化浅析

时间:2019-02-03 19:48:11      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:ack   []   cst   lse   serve   代码   顺序   ret   std   

前言

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;
}

容器元素增删内存变化浅析

标签:ack   []   cst   lse   serve   代码   顺序   ret   std   

原文地址:https://www.cnblogs.com/caczhtus/p/10350828.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!