C++:使用容器存放带有指针变量的类对象时的注意事项

C++ stl container 存放含动态数据自定义类的注意事项(堆已损坏) Author: YuMaNzI Date: 2015/04/24 stl实现的多种容器使用简单,性能良好,能极大提高日常的c++ code开发效率。但我们在用这些容器存储自定义类(而不是简单的int,、double、string等数据类型)时,一定要注意生存空间的问题。下面通过一个例子简单说明: class SimProf { public: SimProf(); ~SimP 阅读详情

注意事项:使用容器存放带有指针变量的类对象时一定要重载复制构造函数。下面示例说明:

定义两个类:
class DataItemRegValue
{
public:

    BYTE ModBusType;

    short DataMark;

    BYTE RegisterCnt;

public:

    DataItemRegValue();

    virtual ~DataItemRegValue();

};

class DataItem
{
public:

    BYTE ModBusType;

    BYTE DeviceNo;

    BYTE DataCnt;

    /// <summary>
    /// 数据项
    /// </summary>
    vector<DataItemRegValue>* m_pItemList;

public:

    DataItem(const BYTE& modbusType);

    DataItem(const DataItem& data);

    virtual ~DataItem();

public:

    int GetLength();

    int ReadBuffer(const int& pos, BYTE* pBuffer);
};

//DataItem
DataItem::DataItem(const BYTE& modbusType)
{
    ModBusType = modbusType; 

    ModBusType = 0;

    DeviceNo = 0;

    DataCnt = 0;

    //堆上分配内存。
    m_pItemList = new vector<DataItemRegValue>();
}

//复制构造函数,加入容器时,或通过复制创建一个新的对象时调用它。
DataItem::DataItem(const DataItem& data)
{
    this->DataCnt = data.DataCnt;
    this->DeviceNo = data.DeviceNo;
    this->ModBusType = data.ModBusType;
    this->m_pItemList = new vector<DataItemRegValue>();
    this->m_pItemList->assign(data.m_pItemList->begin(),data.m_pItemList->end());

}

//析构函数,释放内存。
DataItem::~DataItem()
{
    if(m_pItemList != nullptr)
    {
        m_pItemList->clear();
        delete m_pItemList;
        m_pItemList = nullptr;
    }
}


//调用
其中m_pItemList定义为vector容器:
vector<DataItem>* m_pItemList = new vector<DataItem>();

int ReadBuffer(const int& pos, BYTE* pBuffer,const int& nBufferSize)
{
    if (pos < 0 || pBuffer == nullptr)
    {
        return -1;
    }

    CUnPacket unpk(pos, pBuffer);

    int CurIndex = unpk.GetCurIndex();

    for (; CurIndex < nBufferSize; )
    {
        DataItem item(ModBusType);
        item.ReadBuffer(CurIndex, pBuffer);
        CurIndex += item.GetLength();
        
/*m_pItemList是一个容器,注意了,在数据被push_back到容器中时,会调用DataItem的复制构造函数。如果没有重载DataItem的复制构造函数,则系统会调用默认的复制构造函数,这样,同一个指针值存放在两个不同的指针变量中,DataItem变量构造了两次,声明局部变量时调用构造函数创建对象,在数据push_back到容器中时调用了复制构造函数创建了另一个对象放入容器m_pItemList中,当这两个对象调用析构函数销毁时,同一个指针值指向同一块内存,被析构了两次,从而导致异常报误。*/

        m_pItemList->push_back(item);
    }
    return 0;
}

c++vector容器存放自定义数据类型(指针和对象)(七) 这里有C++STL——全面总结详细教程(附案例解析)(持续更新中) vector中存放自定义数据类型,并打印输出 新建Person类,数据为:姓名和年龄。 通过vector容器创建对象,并插入。 对象可直接插入,指针在插入时,带上创建对象的地址&。 #include<iostream> using namespace std; #include<vector&... 阅读详情

相关推荐

龙头复盘神器/复盘于导出工具最新版5.6

龙头复盘神器,复盘于导出工具

初入python踩过的坑 8240

C++ 容器中存入”指针“及对象析构问题

[转]C++ 容器中存入”指针“及对象析构问题  (2012-09-20 23:32:20) 转载▼ 标签:  杂谈 分类: C相关 【转自】:http://blog.sina.com.cn/s/blog_4b3c1f950100kgps.html 一般地当我们只想知道一个值是否存在时,set 最有用处;希望存储也可能修

jfkidear的专栏 1万+

从零搭建 C# + YOLO 工业视觉系统:从模型训练到上位机部署(工业级落地)

做工业质检、自动化生产线的同学都懂:一套能用的工业视觉系统,既要“检测准”,又要“界面易操作”,还要“部署稳”。之前帮某电子厂做PCB缺陷检测,一开始用Python+YOLO做检测核心,QT做上位机,结果踩了无数坑:Python推理速度波动大,QT和Python跨语言集成繁琐,数据传递容易卡顿;后来换成C# + YOLO的组合,直接打通了“模型训练-上位机开发-工业部署”全流程——C#的WinForms/WPF开发上位机高效,工业相机SDK支持完善;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 737

(四)C++序列容器存储智能指针详解

通常用容器保存指针比保存对象更好,保存智能指针比原生指针好。 在容器中保存指针需要复制指针而不是它所指向的对象。复制指针通常比复制对象快。 在容器中保存指针可以得到多态性。存放元素基类指针的容器也可以保存其派生类型的指针。 对指针容器的内容进行排序的速度要比对对象排序快,因为只需要移动指针,不需要移动对象。 保存智能指针要比保存原生指针安全,因为在对象不再被引用时,自由存储区的对象会被自动删除。这样就不会产生内存泄漏。不指向任何对象的指针默认为nullptr. 主要有两种类型的智能指针:uni..

qq_23123181的博客 2757

UNet改进(19):基于残差注意力模块Residual Attention的高效分割网络设计

本文提出一种结合注意力机制的改进UNet网络,通过引入残差注意力模块(ResidualAttentionBlock)增强医学图像分割性能。该网络在传统UNet的U型结构基础上,创新性地将轻量级注意力机制与残差连接相结合,在编码器-解码器各层级实现特征重标定。改进后的网络具有三方面优势:通过注意力机制自适应聚焦关键特征区域,利用残差连接缓解梯度消失问题,采用模块化设计灵活配置注意力位置。

2501_91516851的博客 780

华为OD机试真题 新系统 9月27号 【数据中心最佳维护窗口】

华为OD机试真题 新系统【数据中心最佳维护窗口】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【数据中心最佳维护窗口】多语言题解。

qq_45776114的博客 1160

vector 设置大小_STL-C++ vector部分

本文是关于c++中STL库中的一些记录,主要是因为之前在网上找到关于STL的资料太过简洁,并且只停留在如何使用函数,对于底层具体实现较少,所以想自己对这些知识记录一下,当然我目前对STL库了解也不深入,以后如果会有新的了解的话,会继续更新。vectorvector定义templatevector底层采用的数据结构是一段连续的线性空间,vector可以当做被封装之后的数组,提供了一些方法使得我们更好...

weixin_39619170的博客 3185

2026年摩尔线程数字IC面试试卷带答案

本文摘要: 该试卷为数字IC设计笔试,满分120分,时长90分钟,包含单选题、波形分析题、多选题和代码设计题。重点考察时序约束(如set_false_path)、建立/保持时间、逻辑化简、复位机制、AXI协议、半导体工艺、状态机、GPU架构等核心知识点。多选题涉及异步FIFO设计、Verilog综合、亚稳态处理、C++关键字和低功耗技术。代码题要求实现单比特信号去毛刺电路,需稳定4个时钟周期才输出。试题解析详细,标注了企业面试高频考点,如摩尔线程自研的MUSA架构和花港GPU架构特点。整体内容专业性强,覆盖

Open 98

C++ 容器存储对象时,指针调用析构函数触发的一系列BUG

今天给大家分享一篇BUG文章,请耐心看完,也许你以后也会遇到这样的BUG而解决不了! 需求是这样的: 定义一个Student类,里面有私有成员整型和指针! 例如:int age; char *name; 我们需要把类定义的对象存入容器中。 其中会发生一系列好玩的事情,拭目以待! 不懂容器的可以点击下面去学习: list容器 deque容器 vector容器 我们这里以vector为例子说明,其他...

cpp_learner的博客 1551

AI测试干货:让大语言模型稳定输出 JSON 的四种实现方案

用大语言模型做测试用例生成、数据提取时,最头疼的就是让它老老实实返回 JSON。你以为它会给你 `{"name":"张三"}`,结果它来一句"好的,这是生成结果:```json...",或者干脆在 JSON 里加注释,直接把你的 `json.loads()` 干崩溃。 模型本质上是个话痨,天生爱解释。但我们要的是结构化数据,不是聊天记录。我整理了四种实战方案,从最简单的提示词技巧到工程化框架,覆盖了从快速验证到生产环境的各种场景。

blues_C的博客 957

计算机视觉与深度学习 | Matlab实现ORBSLAM2(附完整代码)

================================================ 博主github:https://github.com/MichaelBeechan 博主优快云:https://blog.youkuaiyun.com/u011344545 ================================================ 代码阅览 效果图 代码 imdsLeft = imageDatastore('C:\MichaelSpace\matlabworks

尘世冰封的专栏 1522

C++容器的介绍和使用

容器是用来存储和组织数据的类模板容器-顾名思义就是拿来装东西的。你可以装标准的基本数据类型,如int,double,string等、也可以装复杂的自定义类型,例如class 定义的类的对象,对象指针等复合类型的数据。C++ stl标准库提供了多种容器,每种容器都有特定的用途和性能特点。对于map,set,multimap,multiset,当对顺序有要求时候,选择这些,对顺序无要求时候,可以选择带unordered_前缀的容器,以提高性能。

harmonyluo的博客 1742

【踩坑记录】pandas.to_sql 报 “‘Engine‘ object has no attribute ‘cursor‘”,最后竟然是环境问题

摘要 本文记录了使用pandas+SQLAlchemy+pymysql将数据写入MySQL时遇到的"Engine对象无cursor属性"错误及其解决方案。问题表现为to_sql方法将SQLAlchemy引擎误认为普通DBAPI连接,导致调用cursor()方法失败。经排查发现,这是由于pandas/SQLAlchemy环境损坏所致,而非代码问题。最终通过完全卸载并重新安装pandas(≥2.1)、SQLAlchemy(≥2.0)和pymysql解决了该问题。文章还建议将遗留的read_s

每日出拳老爷子的博客 336

c++ 指针容器

The Standard Librarian: I/O and Function Objects: Containers of Pointers Matthew Austern http://www.cuj.com/experts/1910/austern.htm?topic=experts -----------------------------------------------

TIC_YX的专栏 9279

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【C++】map和set的使用及注意事项

我们即将要学的map,set就是一种树形结构的关联式容器,也是用来存储数据的,其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高。与序列式容器不同的是,数据与数据之前有紧密的关联,插入的数据有固定的位置,正因为插入的数据有固定的位置,才能快速进行搜索。

fight_p的博客 1535

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

c++ set容器存储指针,智能指针用法

c++ set容器存储指针,智能指针用法Set容器存储c++内置变量Set容器存储指向类对象的智能智能对象 Set容器存储c++内置变量 set容器存储基础变量像int,char,或者是string对象,我们不需要去写比较函数,但是如果存储的是自定义类对象或者是结构体,那就需要重载&amp;amp;amp;lt;运算符或者重载(),在构造set容器时作为第二个参数传入,set容器存储内置变量,我就不记录了,这篇文章主要讲...

lwkhdx的博客 7058

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C++ --- 指针的使用(如何理解指针?指针的细节你又了解多少?)

指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。

记得开心一点嘛的博客 1703

【入门级-C++程序设计:11、指针与引用-指针】

接下来我们做一个比喻来进行说明:内存的地址在计算机中是连续存储的,目前我们有一个1M的内存,内存的地址范围是:0x00000~0xFFFFF,每一个内存地址可以存放一个数据,我们可以把每一个地址(指针)看作是每一个房间号,每个房间住着的人就相当于内存中存储的数据,也就是说每个房间号就是这个房间的“指针”,每个房间住的不同的人就是内存中存储的不同的数据,我们要想找到不同的人(内存中的数据),只要找到这个人的房间号(指针)就可以找到这个人。// 将a的地址赋值给p,p现在指向a。

papership的博客 971

C++中STL 容器中引用与指针的使用对比(vector<T*> vs vector<T&>)

需求推荐做法需要引用对象,但不能复制使用需要控制对象生命周期使用存指针集合并自由操作使用存值并自动管理使用直接存值想要传值修改原始变量→ 用想要灵活指向不同对象→ 用裸指针或智能指针集合❌ 不要尝试vector<T&>—— C++ 不允许。

qq_36812406的博客 567

C++中string的使用方法与注意事项

string作为C++中的重要数据类型,C++提供了多种操作string的方法,我们不必深究每种方法的实现原理,只需了解每种方法的操作方式和注意事项即可。

2501_93018024的博客 2284

【一分钟学C++】指针和引用

C++指针和引用。

记录点滴,终成江河! 1013

十年C++企业级架构师分享:C++的核心知识点有哪些?

C++是一门被广泛使用的系统级编程语言,更是高性能后端标准开发语言;C++虽功能强大,灵活巧妙,但却属于易学难精的专家型语言,不仅新手难以驾驭,就是老司机也容易掉进各种陷阱。 这是小编准备的C++学习资料,加小编学习群:825414254,加群即可获取哦! 本文结合作者的工作经验和学习心得,对C++语言的一些高级特性,做了简单介绍;对一些常见的误解,做了解释澄清;对比较容易犯错的地方,做了归纳总...

2482

C++知识点36——使用智能指针的注意事项(下)

四、智能指针与容器 当把shared_ptr对象放入一个容器中时,会调用shared_ptr的拷贝构造函数并且引用计数+1 int main(int argc, char const *argv[]) { shared_ptr<test> sp=make_shared<test>(); vector<shared_ptr<test>> vsp; vsp.push_back(sp); cout<<sp.use_count()<&

Master Cui的博客 928

全面理解C++函数最难理解的部分:数组形参,函数指针,以及函数指针作为形参

函数指针的声明包含函数的返回类型和参数类型。这里,ReturnType是函数的返回类型ParameterTypes是函数的参数类型列表(用逗号分隔)pointerName是你选择的指针名称。例如,以下代码定义了一个名为fp我们讨论了几个关于函数形参以及函数指针的主题:数组形参:我们首先讨论了数组形参的特性,以及为什么它们在传递到函数时会被自动转换为指向数组首元素的指针。这是由于C++的两个规则导致的:一是数组是不允许拷贝的,二是在使用数组时通常会将其转换为指针。

weixin_49503250的博客 3377

带捕获的 lambda 与函数指针

介绍 lambda 函数和函数指针类型转换的方法。

Kovnt的博客 1900

【C++11新特性:15】—— C++11 for循环使用注意事项

c++11

holly的专栏 623
上一篇: 如何使用windbg定位c/c++代码的内存泄漏。(转)
下一篇: c&c++的int和long各自所占字节数
ComputerInBook
博客等级 码龄19年 1168粉丝 464原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值