首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

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

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

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

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

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

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

任何情况下,此函数不调用构造函数或初始化内存。不保证调用匹配的解分配函数的预备使用的智能指针。C++ 中偏好的内存分配方法是用 RAII 预备函数 std::make_unique 、 std::make_shared 、容器构造函数等,而在低层代码中为 new 表达式。

new 表达式所创建的对象按照下列规则初始化:对于非数组的类型,在所得内存区域中构造单个对象。若无初始化器,则对象被默认初始化。若初始化器 是带括号的实参列表,则对象被直接初始化。若初始化器 是花括号包围的实参列表,则对象被列表初始化。

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

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

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

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

帮助手册说明地址

https://zh.cppreference.com/w/cpp/memory/c/malloc

帮助手册说明地址

https://zh.cppreference.com/w/cpp/language/new

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201209A0IO4R00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券