前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一天一个离职技巧之代码优化

一天一个离职技巧之代码优化

作者头像
Qt君
发布2023-03-17 14:32:53
1770
发布2023-03-17 14:32:53
举报
文章被收录于专栏:跟Qt君学编程跟Qt君学编程

又到公司代码评审了,每次都能找到一些幺蛾子,看看这次又是什么?最近新来了几个实习生,希望对代码下手轻点。

  小看半小时,代码问题不大,都是一些细节问题。喝口82年的咖啡压压惊,再继续评审吧。

  有妖气!代码中看到了大量的malloc和free,代码大概是这样子的:

代码语言:javascript
复制
class Car
{
public:
    Car() { }
};

Car *car = (Car *)malloc(sizeof(Car));
free(car);

  居然对一个类下手,用的是malloc,看起来和平时的不一样啊。直觉编程:看起来很奇怪,那么它很大概率有问题。

  指针类一般使用new创建或delete删除,但使用malloc和free有点C语言风格的味道了。看起来怪怪的,但是找不到问题所在,有点气啊。

  代码评审有时候挺好的,遇到不懂的问题又可以学习了。既然一般指针类的创建和销毁是使用new或delete,而代码中使用了malloc和free,那就看看它的定义,看看有什么区别。

  那就找找C++帮助手册呗(cppreference.com),看完malloc和new的C++帮助手册说明,大概知道上面代码中使用不恰当的地方了,我们先看下手册是怎么说明的吧。

  1. malloc任何情况下,此函数不调用构造函数或初始化内存。不保证调用匹配的解分配函数的预备使用的智能指针。C++ 中偏好的内存分配方法是用 RAII 预备函数 std::make_unique 、 std::make_shared 、容器构造函数等,而在低层代码中为 new 表达式。
  2. new: new 表达式所创建的对象按照下列规则初始化:对于非数组的类型,在所得内存区域中构造单个对象。若无初始化器,则对象被默认初始化。若初始化器 是带括号的实参列表,则对象被直接初始化。若初始化器 是花括号包围的实参列表,则对象被列表初始化。

  从上面的帮助说明中得出:malloc创建的类是不能调用类的构造函数的,而new则会调用类的构造函数。同样地,free销毁类也是不能调用类的析构函数的。

  如果类内有指针成员,需要在构造函数中初始化,而实际上用了malloc创建类,没能调用构造函数初始化,最后会导致意想不到的后果(内存访问错误导致崩溃)。

  问下当事人说:我这是故意的,因为malloc创建的类不会调用构造函数,这样就可以让程序执行少一些代码,从而提高运行效率。

  看着他得意地说得头头是道。我只能躲在角落瑟瑟发抖,心里默默念:我不干了!!!

malloc帮助手册说明地址: https://zh.cppreference.com/w/cpp/memory/c/malloc

new帮助手册说明地址: https://zh.cppreference.com/w/cpp/language/new

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档