Ineffective C++(1):STL容器不仅仅可以保存指针

C++ 存储指针的容器删除元素 假设需要用vector等容器存储指针,形如vector<typename *>,在删除元素的时候,仅仅使用erase改变了容器的存储,却没有释放指针所指向的内存,一不小心就造成了内存溢出。 故,我们需要在erase的同时释放内存。 template<typename T> void deleteObject(T *obj){ delete obj; ... 阅读详情
前言

       在公司这两年没少带新人,有刚毕业的,也有工作了两三年的。除了要把公司项目的一些知识告诉他们,通常了需要review一下他们的代码。发现很多人在C++的基本概念上存在错误或者偏差,或者某种习惯用法有瑕疵。这些问题千奇百怪,往往令人哭笑不得。一直想把他们记录下来,于是有了此系列。此系列标题取为Ineffective C++绝对没有想与大师比肩的意思,纯粹是为了搞笑。:)


STL容器不仅仅可以保存指针

        我就不明白为什么如此之多的人使用list或者vector时只用它保存对象的指针。如果对象是一个复杂的class,它的拷贝构造和赋值操作比较昂贵,那当然是使用list<MyClass*>是很合理的。问题是一个简单的struct,类似:

struct tagItem
{

       int   nID;

       int  nNum;
};

他都要使用list<tagItem*>,最晕的是当需要一个列表保存一些物品ID时,我看到了下面的数据定义:
     list<DWORD*> m_itemIDList
,
每次需要添加一个时,就需要new一个DWORD,然后赋值,然后push_back到list中,在erase之后还要记得delete。

 

产生这种用法(下面只谈类似list<tagItem*>这种)多数处于两种原因:

1.       对STL不熟悉
list
是否帮你保存对象呢?如果你使用list<tagItem>,当你push_back的时候发生了什么呢?如果你还不是很确定答案的话,那你一定要把《C++标准程序库—自修教程与参考手册》好好的读一遍。

2.       过分担心性能
有的人告诉我,他认为tagItem的拷贝会影响效率。恩,考虑到了效率,算是一个进步,但是这笔账还是要算得更清楚一些。tagItem对象到底占多少字节?你的这个list是不是会经常更新?每帧更新几次,还是当某个事件产生时才操作一次?多数情况下,这点性能损失时不值得你手动管理一个tagItem对象的内存的。

 

总结一下,对于简单的数据类型,强烈推荐使用list<tagItem>这种写法,除非你仔细考虑了性能问题。

C模板实现STL容器中的vector C模板实现STL容器中的vector 最近在工作中因为一直用C语言开发,刚好有点闲时间就准备写一个C的STL作为以后开发使用。因为实习的公司不能上外网,每天晚上再重写一下白天的代码,也确实够苦逼的。话不多说,下面就说说C语言中模板实现的几种方法吧! 1,C语言模板实现技术 1.1 宏替换来实现 C语言中宏是实现很多高级功能的有力武器,其中宏函数可以完成一些比较给 阅读详情

相关推荐

中科蓝讯蓝牙开发:从源码到固件的自动化构建链路解析

本文详细解析了中科蓝讯AB530X蓝牙芯片从源码到最终固件的完整自动化构建链路。通过剖析prebuild.bat、GCC编译、postbuild.bat等关键环节,阐述了资源打包、配置生成、代码编译与固件合成的全过程,并重点介绍了如何实现一键编译与自动下载,为开发者高效进行嵌入式蓝牙开发提供清晰指南。

weixin_29193259的博客 121

C++序列容器存储智能指针

通常用容器保存指针比保存对象更好,而且大多数时候,保存智能指针比原生指针好。下面是一些原因: 在容器中保存指针需要复制指针而不是它所指向的对象。复制指针通常比复制对象快。 在容器中保存指针可以得到多态性。存放元素基类指针的容器也可以保存其派生类型的指针。当要处理有共同基类的任意对象序列时,这种功能是非常有用的。应用这一特性的一个常见示例是展示一个含有直线、曲线和几何形状的对象序列。 对指针容...

积累点滴,保持自我 2208

ThingsBoard入门实战(七):公共发布和 UI 细节修改

公共发布和 UI 细节修改7.细节修改和公共发布一、公共发布二、UI优化下载运行修改三、下一步还可以做什么?更好的UI更丰富的系统模块 7.细节修改和公共发布 GET到新技能了,想给兄弟们演示,需要给他们每个人一个账号么? 答案肯定是:不需要! ThingsBoard 用 公共发布 解决了这个问题。 一、公共发布 首先我们来看一下路灯设备现在在谁名下? 如下图,路灯都是customerA的, 目前只有它和它的租户可以看到,其他人需要看就需要设为公有。 如图操作: 对于设备详情仪表盘,我们也需要设为公有

AIGC搞起 9119

C++中Vector/Map/List中尽量使用指针,避免直接保存对象

  昨天改了个模型,发现跟踪出问题了。吾当时猜测了一下原因,做了修改,结果还是不成功。   今天跟别人一齐查,结论是:改的思路是对的,问题在于,修改的是复制实例,不是原实例。代码如下: //Vector&lt;BBoxInfo&gt; detected; int object_num = detected-&gt;numObjects; for (int i=0; i...

柳鲲鹏 5310

士兰微SC7A20H三轴加速度计在智能穿戴设备中的运动检测实践

本文详细介绍了士兰微SC7A20H三轴加速度计在智能穿戴设备中的运动检测实践,包括其工作原理、硬件设计避坑指南、运动检测算法优化、低功耗设计及校准测试技巧。SC7A20H凭借±16g超宽量程和0.004g高精度,成为智能穿戴设备的运动感知核心,适用于计步、6D方向检测等场景,显著提升用户体验。

weixin_29168153的博客 742

U3d WebGL使用ToLua

首先我们在编辑器模式下加入Tolua插件,然后配置修改到在编辑器模式下能够正常的运行。 同个U3d 插件Build出WebGL的工程,运行的时候你会发现(有些需要把这个WebGL工程放在一个HttpServer下面,直接本地访问index.html会被拒绝,让你使用http的格式)。 当要加载完的时候会出现 To use dlopen, you need to use Emscripten'...

qq_35267906的博客 2947

STL容器中 存放指针与对象区别 遍历删除与释放操作

c++中我相信大家经常要用到STL里面的各种容器来存放自己的数据,既然我们用的这么频繁那么就相应该有一些疑问?

破茧 1万+

支持向量机算法(带你了解原理 实践)

支持向量机作为一种强大的分类算法,在各个领域都取得了显著的成果。其基于统计学习理论的原理使得它能够在高维空间中找到最优分类超平面,并通过核函数处理非线性问题。

2303_79387663的博客 3738

C_C++的union的使用总结 (转…

原文地址:(转)">C_C++的union的使用总结 (转)作者:Olim前言   熟悉C的程序员都知道union(联合体)的用法,利用union可以用相同的存储空间存储不同型别的数据类型,从而节省内存空间。当访问其内成员时可用"."和"->"来直接访问。在C++出现后,它继承了union并保留了其在C中的特性。但是在C++中的union又有了新的扩展,这需要大家了解,要不然你会感到费解和迷惑。

jiqiujia的专栏 1168

thinkphp5.0.24反序列化漏洞分析

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

m0_67392182的博客 1871

Spring AI Alibaba实战训练营-05模型输出质量评估

本文介绍了使用Spring AI Alibaba库评估AI模型输出质量的方案。项目通过5种评估器实现自动化评估:相关性评估、事实准确性评估、答案相关性评分、答案正确性评估和忠实度评估。开发步骤包括环境准备(Java 17、Maven、API Key获取)、创建Maven项目、配置Spring AI(通过环境变量安全设置API Key)以及实现RAG流程。重点强调了通过评估器自动检测AI输出的质量指标,帮助开发者优化AI应用性能。

program哲学 217

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

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

qq_23123181的博客 2757

AI测试入门:基于 RAG 的 LLM 应用程序的测试方法「详细介绍」

一个典型的 RAG 架构包括一个检索器(对知识库进行矢量搜索检索上下文的组件)和一个生成器(从检索器中获取检索上下文以构建提示并生成自定义 LLM 响应作为最终输出的组件)。在大多数情况下, 知识库”由存储在向量数据库(如 ChromaDB)中的向量嵌入组成。

blues_C的博客 1870

C/C++指针地址存储问题?

在c/c++中,定义的全局指针变量和局部指针变量在空间分配上有什么区别?我试了一下,发现定义全局变量,在没有赋值的情况下,直接输出它们结果都是0。但是局部变量在没有赋值的情况下都是随机地址。有点迷糊,没有查到资料,还请大佬们解答。 ...

henu_student的博客 907

STM32F407中文手册

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

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

c/c++ vector对象常用内置函数使用

1、简介 vector是向量类型,可以容纳许多类型的数据,因此也被称为容器(可以理解为动态数组,是封装好了的类)进行vector操作前应添加头文件#include <vector>; 2、初始化 五种方式 1、//定义具有10个整型元素的向量(尖括号为元素类型名,它可以是任何合法的数据类型),不具有初值,其值不确定 vector<int>a(10); 2、//定义具有10个整型元素的向量,且给出的每个元素初值为1 vector<int>a(10,1); 3、//用向

qq_38595610的博客 1564

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

注意事项:使用容器存放带有指针变量的类对象时一定要重载复制构造函数。下面示例说明: 定义两个类: class DataItemRegValue { public: BYTE ModBusType; short DataMark; BYTE RegisterCnt; public: DataItemRegValue(); virtual ~DataItemRegValue(); }; class DataItem { public: BYTE...

ComputerInBook的专栏 956

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

c++ vector中存放指针

#include #include #include #include using namespace std; int main() { vector* > *ve = new vector* >(); pair *p1 = new pair("hello","world"); pair *p2 = new pair("ss","sdf"); ve->push_back(p1

u010442009的专栏 1万+

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

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

lwkhdx的博客 7058

c++ map 容器不存放指针

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34253126的博客 1604
上一篇: Ogre学习笔记(6):BspSceneManager
下一篇: Ogre学习笔记(7):Lighting
yanonsoftware
博客等级 码龄21年 104粉丝 67原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值