前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ std::vector元素的内存分配问题(补充)

C++ std::vector元素的内存分配问题(补充)

作者头像
卡尔曼和玻尔兹曼谁曼
发布2019-01-22 10:02:52
1.7K0
发布2019-01-22 10:02:52
举报

在上篇博文C++ std::vector元素的内存分配问题中我们已经明确了使用std::vector容器时元素在内存中的创建情况。 所以,我个人觉得使用std::vector<T> vec;这种类型的最省时省力。 我们还是看原来的例子:

代码语言:javascript
复制
#include <iostream>
#include <vector>

using std::cout;
using std::vector;

class A
{
public:
    A();                //构造函数
    A(const A& a);      //拷贝构造函数
    ~A();               //析构函数

};

A::A()
{
    cout << "A的构造函数..." << '\n';
}

A::A(const A& a)
{
    cout << "A的拷贝构造函数..." << '\n';
}

A::~A()
{
    cout << "A的析构函数..." << '\n';
}

int main()
{
    vector<A> vecA;
    A a;
    vecA.push_back(a);

    return 0;
}

运行结果如下:

代码语言:javascript
复制
A的构造函数...
A的拷贝构造函数...
A的析构函数...
A的析构函数...

在main函数中我们创建了一个std::vector容器,创建了一个A对象,并将创建的A对象加入到std::vector容器中。在这个过程中,首先A a;这一句使用A的构造函数初始化A对象,并且A对象是在栈上创建的。vecA.push_back(a);在堆上拷贝构造了A,然后将原来栈上的A进行析构。所以,我们看到输出结果中先是调用A的拷贝构造函数,然后再调用A的析构函数。最后,在退出main函数之前,std::vector容器会自动再次调用A的析构函数销毁掉堆上的A。这就是整个过错。 所以,这样使用std::vector我们就不用担心对象的析构问题,因为std::vector会帮我们做最后的析构操作。唯一的确点就是中间存在对A对象的拷贝,可能稍微会影响性能,但是如果容器中的元素不多的时候,关系是不大的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年02月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档