记录一些项目中遇到的代码实现 / 编译 等问题


编译链接

使用初始化和使用赋值时,调用的函数不同;使用 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++ 相关问题记录的更多相关文章

  1. Echarts的相关问题记录与应用

    一.相关问题记录: 1.对图表的div进行隐藏操作,使用hide()或display:none,重新展示时,会造成图表无法获取高度,导致图表的高宽不符合预期: 解决方法:最后调用一下resize()函 ...

  2. piezo film 压电相关信息记录 (2018-05-04 更新)

    piezo film 压电相关信息记录 起因需要使用 Piezo 做一些设计 http://www.te.com.cn/chn-zh/videos/transportation/piezo-film- ...

  3. saltstack 开发相关命令记录

    SALT API开发相关命令记录. 查看当前的salt key信息salt-key -L 测试被控主机的连通性salt '*' test.ping 远程命令执行测试salt '*' cmd.run ' ...

  4. Vue-cli 多页相关配置记录

    Vue-cli 多页相关配置记录 搭建一个顺手的MPA项目脚手架,其实根据项目的不同目录结构和打包配置都可以进行灵活的调整.这次的项目可能是包含各种客户端和管理后台在一起的综合项目所以需要将样式和脚本 ...

  5. Yii2的相关学习记录,前后台分离及migrate使用(七)

    最近一直忙其它的(其实是懒!),将<深入理解Yii2>看了一遍,一些当初没明白的稍微明了了点,然后又看yii2的图片上传等处理.富文本.restful什么的,但由于没进行到这里,只看也不管 ...

  6. Yii2的相关学习记录,alert等美化、confirm异步、session中的flash及小部件的使用(六)

    呃,系统自带的alert.confirm等弹出框实在是难看,作为一个颜控,这能忍? 这里我用的是kartik-v/yii2-dialog,这个是基于bootstrap3-dialog这个来做了一些常用 ...

  7. Yii2的相关学习记录,初始化Yii2(二)

    前面已经将Yii2下载下来了,那我们就需要能实际的使用. 一.初始化,因为我都是在windows系统下,所以用cmd命令打开下载下来的Yii2的根目录.然后运行下面命令: init 会提示选择0为开发 ...

  8. Yii2的相关学习记录,下载Yii2(一)

    原先学习过Yii1的相关知识,虽然也是半懂不懂的,但稍微的结构是了解的.现在利用晚上的时间学习下Yii2的使用,打算建一个后台管理系统,这里记录下,以免自己以后忘记. 目前已看一部分Yii2的权威指南 ...

  9. java 项目相关 学习记录

    一位资深程序员大牛给予Java初学者的学习路线建议  [任何时期都可以好好看看] https://www.imooc.com/article/8993 https://www.jianshu.com/ ...

  10. iOS上架被拒理由及相关解决方案记录

    注:苹果客服中国区电话:4006 701 855 最近公司上线一个电动车工具类项目,被拒无数次,今天上架了,记录一下 01 苹果拒绝理由(内购和后台定位) We noticed that your a ...

随机推荐

  1. Composer 安装 Jira API 库

    环境要求: PHP >= 5.5.9 php JsonMapper phpdotenv 安装 下载安装 Composer curl -sS https://getcomposer.org/ins ...

  2. Android开发--IntentService的用法,你错过了什么

    Android开发--IntentService的用法,你错过了什么 . 本文链接:https://blog.csdn.net/smbroe/article/details/45009721 Inte ...

  3. Leetcode: 24 Game

    You have 4 cards each containing a number from 1 to 9. You need to judge whether they could operated ...

  4. 【PHP】图片转换为base64,经过post传输后‘+’会变成 ‘空格’

    图片转换为base64,经过post传输后‘+’会变成 ‘空格’, 需要用PHP 处理一下 $str= $_POST['img_data']; $str= str_replace(' ','+',$s ...

  5. PAT 甲级 1073 Scientific Notation (20 分) (根据科学计数法写出数)

    1073 Scientific Notation (20 分)   Scientific notation is the way that scientists easily handle very ...

  6. 使用SampleRateConverter对音频采样率进行转换

    java sound resource SampleRateconverter.java(接近于官方源码) 输入目标采样率,输入文件,输出文件.食用方便;p 比如 SampleRateConverte ...

  7. 【 Linux 】Systemd 使用说明(1)

    1. 前言 在 CentOS 7 中使用 systemd 取代了 init 的启动模式,这样的更新换代有什么好处呢?首先需要对 init 和 systemd 有个概念的认识. 2. init 概述 在 ...

  8. 组件文档系统-md-react-styleguidist

    推荐指数:

  9. 迅速生成项目-react-static

    推荐指数:

  10. golang实现无限级菜单(beego框架下)

    原文地址  http://www.niu12.com/article/37 golang实现无限级菜单(beego框架下) 数据表如下 -- ---------------------------- ...