C++ 相关问题记录
记录一些项目中遇到的代码实现 / 编译 等问题
编译链接
使用初始化和使用赋值时,调用的函数不同;使用 auto_ptr() 时可能会出现编译错误
std::auto_ptr<Class> pClass(new Class()); // 这里调用的是 operator()()
std::auto_ptr<Class> pClass = new Class(); // 这里调用的是 operator=(),会报错
直接赋值会存在二级指针的问题
宏定义不受命名空间的约束
即两个头文件中有相同的宏定义,即使加了 namespace 也不能解决编译时 redefine 的问题
Switch-case 中不能定义变量
在 switch-case 中定义了变量,用 g++ 编译的时候报错
crosses initialization of “XXX”
变量定义在 case 中,gcc 会出现 "交叉初始化" (crosses initialization) 的错误,因为可以跳过对象的初始化,这个 "没有创建的对象" 依然在 switch 的作用域中
switch(k)
{
case 1:
int t = 4;
break;
default:
break;
}
将变量定义放在 switch-case 外就解决了
Getting a bunch of crosses initialization error
技巧/注意项
多层继承中基类的纯虚函数
多层继承中,若最底层的基类有定义纯虚函数,最好在每一层中都实现该虚函数,否则当产生多态时,可能当前基类没有函数符号导致编译错误
通过配置文件控制日志的输出
当输出调试相关的日志时,判断下该项配置
在用户环境可以关掉这个配置,相当于切换 debug 和 release 版本
工厂模式中的 context 类
工厂模式中,A 类产生的 B类,需要修改 A 类的内容;可以将 A 类中部分属性外包成成员变量 context;在 B 类中获取 context 指针即可
(任何计算机相关的问题都可以通过加一层解决)
尽量使用多态来代替类型判断
当需要对一个派生类进行特殊操作时,不应该去手动 if 判断类型,而是使用 虚函数/基类预设的成员变量,来在派生类重写虚函数 / 主动 set 成员变量,从而实现在运行时的类型不同而区分不同的行为
(前提是这个行为在派生类中拥有共性)
语法
多态在基类中仍生效
当一个派生类对象调用虚函数时,除非显式调用基类方法( Base::vfunc() ),否则其调用的虚函数取决于该对象的类型
bool THtmlEvalParser::Parse(const char * pHtml, const size_t nHtmlLen)
{
// 这里显示调用了基类的 Parse 函数
THtmlParserBase::Parse(pHtml, nHtmlLen, m_nMaxTreeNode);
... ...
void THtmlParserBase::Parse(const char * pHtml, const size_t nHtmlLen, size_t
nMaxNode)
{
... ...
if( pCurrentPos < pTagBegin)
{
// 这里虽然是在基类的方法中,但是当前对象是派生类型,所以将调用的是 THtmlEvalParser 的 ParseContent
// (前提是 ParseContent 是虚函数且 THtmlEvalParser 重写了该函数)
ParseContent(pCurrentPos, pTagBegin);
}
... ...
原因是在对象生成时,派生类重写的虚函数方法已经覆盖了虚表,当调用虚函数时需要查表,自然调用的是派生类虚方法的指针
string find
查找字符串 strA 是否包含子串 strB,不是用
strA.find(strB) > 0
而是
strA.find(strB) != string:npos;
// or
string::size_type pos = strA.find(strB);
if (pos != string::npos)
{
... ...
}
获取文件大小
TFile 里封装了一个 fd,可以当文件流使用
可以通过 seekg() 将指针移至末尾,再使用 tellg() 获取文件的 size
TFile decryptAttchment;
decryptAttchment.seekg(0, seek_end);
int nFileSize = decryptAttchment.tellg();
查找串是否出现在列表,需要用 set 实现而不是 string.find
开发一个需求,需要在一个 rcpt list 中查找是否出现指定的 strRcpt
由于从 header 中解析出来的 list 是一个 string 的形式(abc@q.cn, cde@q.cn),直接使用 string.find(strRcpt) 来确定是否有相同的 rcpt;
这里犯了一个错误,子串的匹配可能会出现某个 rcpt 的部分匹配,导致结果认为当前 rcpt 在 list 中
strRcptLst = "abc@q.cn, cde@q.cn";
strRcpt = "bc@q.cn"
strRcptLst.find(strRcpt) // 这里将匹配到 abc@q.cn 的部分
所以当需要查找元素是否在集合中还是要使用 set 来处理
Valgrind
关于内存泄漏测试的一些异常
Syscall param write(buf) points to uninitialised byte(s)
Valgrind yells about an uninitialised bytes
Warning: set address range perms: large range
What Does This Valgrind Warning Mean? - warning set address range perms
Address 0xc5927f7 is 0 bytes after a block of size 21,463 alloc'd
valgrind - address is 8 bytes before a block of size 16 alloc'd
C++ 相关问题记录的更多相关文章
- Echarts的相关问题记录与应用
一.相关问题记录: 1.对图表的div进行隐藏操作,使用hide()或display:none,重新展示时,会造成图表无法获取高度,导致图表的高宽不符合预期: 解决方法:最后调用一下resize()函 ...
- piezo film 压电相关信息记录 (2018-05-04 更新)
piezo film 压电相关信息记录 起因需要使用 Piezo 做一些设计 http://www.te.com.cn/chn-zh/videos/transportation/piezo-film- ...
- saltstack 开发相关命令记录
SALT API开发相关命令记录. 查看当前的salt key信息salt-key -L 测试被控主机的连通性salt '*' test.ping 远程命令执行测试salt '*' cmd.run ' ...
- Vue-cli 多页相关配置记录
Vue-cli 多页相关配置记录 搭建一个顺手的MPA项目脚手架,其实根据项目的不同目录结构和打包配置都可以进行灵活的调整.这次的项目可能是包含各种客户端和管理后台在一起的综合项目所以需要将样式和脚本 ...
- Yii2的相关学习记录,前后台分离及migrate使用(七)
最近一直忙其它的(其实是懒!),将<深入理解Yii2>看了一遍,一些当初没明白的稍微明了了点,然后又看yii2的图片上传等处理.富文本.restful什么的,但由于没进行到这里,只看也不管 ...
- Yii2的相关学习记录,alert等美化、confirm异步、session中的flash及小部件的使用(六)
呃,系统自带的alert.confirm等弹出框实在是难看,作为一个颜控,这能忍? 这里我用的是kartik-v/yii2-dialog,这个是基于bootstrap3-dialog这个来做了一些常用 ...
- Yii2的相关学习记录,初始化Yii2(二)
前面已经将Yii2下载下来了,那我们就需要能实际的使用. 一.初始化,因为我都是在windows系统下,所以用cmd命令打开下载下来的Yii2的根目录.然后运行下面命令: init 会提示选择0为开发 ...
- Yii2的相关学习记录,下载Yii2(一)
原先学习过Yii1的相关知识,虽然也是半懂不懂的,但稍微的结构是了解的.现在利用晚上的时间学习下Yii2的使用,打算建一个后台管理系统,这里记录下,以免自己以后忘记. 目前已看一部分Yii2的权威指南 ...
- java 项目相关 学习记录
一位资深程序员大牛给予Java初学者的学习路线建议 [任何时期都可以好好看看] https://www.imooc.com/article/8993 https://www.jianshu.com/ ...
- iOS上架被拒理由及相关解决方案记录
注:苹果客服中国区电话:4006 701 855 最近公司上线一个电动车工具类项目,被拒无数次,今天上架了,记录一下 01 苹果拒绝理由(内购和后台定位) We noticed that your a ...
随机推荐
- tx1 gpio
- php 将office文件(word/excel/ppt)转化为pdf(windows和linux只要安装对应组件应该就行)
一.配置环境 (1)配置php.ini 添加:extension=php_com_dotnet.dll com.allow_dcom = true // 去掉号,改为true 重启环境 (2) 安装 ...
- python自动化登录获取图片登录验证码
主要记录一下:图片验证码1.获取登录界面的图片2.获取验证码位置3.在登录页面截取验证码保存4.调用百度api识别(目前准确率较高的识别图片api)本次登录的系统页面,可以看到图片验证码的位置登录页面 ...
- 004 JpaRepository,CrudRepository,PagingAndSortingRepository的区别
很多程序都在使用,CrudRepository或者PagingAndSortingRepository,但是以前自己的程序使用的是JpaRepository,然后查了一下材料,记录一下. 1.类图 2 ...
- uboot下如何使用fatls工具?
答: 如列出第一个sd卡第一个分区中的文件: fatls mmc 0:1 /
- Maltego更新到4.2.4.12374
Maltego更新到4.2.4.12374 这次更新修改多个bug,并增加一些的特性和功能.主要变化如下: (1)允许用户直接复制实例的属性,以粘贴方式创建新实体. (2)右击网址类实体,右键菜单 ...
- openresty开发系列26--openresty中使用redis模块
openresty开发系列26--openresty中使用redis模块 在一些高并发的场景中,我们常常会用到缓存技术,现在我们常用的分布式缓存redis是最知名的, 操作redis,我们需要引入re ...
- 阿里重磅开源在线分析诊断工具Arthas(阿尔萨斯)
github地址: Arthas English version goes here. Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Art ...
- 我的求职之路:9个offer,12家公司,35场面试,最终谷歌【转载】
作者:Luc(写于2012年) 一.简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回顾. 首先说说我拿到的offer情况: 微软,3面->终面,搞定 百 ...
- ByteBuffer使用实例
ByteBuffer作为JDK的字节流处理对象,这里举个小例子说明下用法,直接上代码: package com.wlf.netty.nettyserver; import org.junit.Asse ...