关于我
-
来自南部的一个小城市,个性不张扬,讨厌随波逐流。
那年今日
💼 从工作中学到的 最近的两个需求尝试以 “面向测试开发”来开发。所谓“面向测试开发”,或者“测试驱动开发”,我理解就是先去写UT,先去在UT里面写好调用的函数和预期的接口。每写一个EXPECT...
👀 产品观察 使用ARC较长一段时间后(超过1个月),发现ARC的同步竟然不支持历史记录、密码这些关键内容。早期0.x版本印象中是可以登陆Google账号同步,正式版改成从Arc Sync 竟然...
📝 每日记录 这两天吃药后,感觉病情不仅没有缓解,反而比之前去医院前更加重了... 如果明天还没有缓解,周三就要去预约CT,周五再去医院看看了。这个春天太煎熬了,这几天温度又非常高。
👀 产品观察 chatgpt4 发布了,我认为目前这种对话式的AI仍然不能取代很多工作。原因是人类的工作大部分靠的是主观能动性,而不是一次一次的对话来获取工作结果的。老板雇佣一个员工,是为了把工...
C++Tips Google C++ Style 关于输出参数在2020年5月20号 以及之前推荐使用指针:
而在之后,则修改规范推荐使用了引用:
个人认为指针作为输出参数更明确语意,如果使用引用参数,程序员可能漏写了const,从而输入参数被误认为是输出参数。
但是可能这不是一个好的理由,因为这是程序员自身的错误,同时传递指针需要内部判空使用有些麻烦。
💼 从工作中学到的
这段代码是有隐患的,但是却比较难发现。因为如果这个数组中最后一位不是
\0
结束符,构造string的过程中就会一直按照地址递增访问内存直到找到结束符为止,这个过程会导致内存异常访问等问题但在真实环境中,可能不一定会导致崩溃,因为当我们new[body_len] 申请一段内存的时候,由于内存对齐以及操作系统的差异性,分配的大小会大于申请的大小,因此在body_len 位置的内存很可能就是结束符。 C++Tips
1:
std::unique_ptr<char[]> response_body(new char[body_len + 1]); // 分配空间 这种非常重要 且常见
memcpy(response_body.get(), origin_response_body.c_str(), body_len + 1); // 拷贝完整字符串
2:动态分配 在设计、开发阶段是要被严格管控的, 至少做到1、在详细设计阶段就要体现在文档里。2、边界检查 3、测试覆盖
好像发的不对,检查了下,基本没有临时的动态分配、
我这里简化了,memcpy的逻辑是另一个函数的事情,函数参数就是char*,所以外部必须传入一个分配好空间的字符指针进去
这个是sdk的代码,个人觉得c++项目而且没有那么高的性能要求下,尽量可以不用char*指针,同时这个sdk内部保存的就是string,但是函数参数是char*导致string->char*->string 这样诡异的逻辑出现