作为一名合格C++程序员应该避免的一些坑

作为一名合格C++程序员在开发的时候应该注意以下情况:

以下例子只有父类的析构函数被调用了。子类的析构函数并没有被调用,则产生错误。
这一点上,对于原始的指针、类或者std::unique_ptr。其表现是一致的。也符合C++基本的语法。
但是对于std::shared_ptr。即便父类析构函数并非虚函数,其子类的析构函数依然可以被调用。
对于此种行为的原因尚未查明(待更新)。也许这是std::shared_ptr专门设计的一种特性。但为谨慎起见,我们也未必需要此特性
父类有虚函数即使它没有成员变量它的sizeof在64位操作系统下也会达到8
在这里插入图片描述

//for memory
对malloc最好对返回值有个检查
在这里插入图片描述
在这里插入图片描述
对new来说不需要检查,new失败会抛异常离开作用域,但new数组的时候delete一定要加[]

在这里插入图片描述
以下例子remakeroom里会造成内存泄漏,因为是引用传递,函数中的操作会影响到实际本身
在这里插入图片描述
以下例子info为局部变量,出了作用域就析构了返回的是一个野指针
在这里插入图片描述
以下例子调用未定义的结点程序崩溃,找不到的话会指向group的end,要检查一下find是否=end
迭代器++要放到迭代器变量的前面
在这里插入图片描述
删除所有特定值
可以用remove函数先把特定值都放在尾位返回第一个特定值的位置,然后通过erase删除
在这里插入图片描述
在这里插入图片描述
判断一个单链表是否有环,用两个指针,一个指针走一步,另一个指针走两步,判断两个指针是否相遇
在这里插入图片描述
左移和右移分为算术左右移和逻辑左右移,左移是一致的右移就不一样
linux下64有符号的
在这里插入图片描述
迭代器没有<这个比较,一般用!=,结束条件也用个迭代变量代替,如果用原生数组没有begin和end函数可以用std::begin,std::end代替
也可以用foreach让模板更加通用
在这里插入图片描述
在这里插入图片描述

如果知道元素个数用vector存储可以用reserve预先分配大小避免重分配造成迭代器失效,用insert效率高于push_back
在这里插入图片描述
当构造函数有抛出异常时应该先把数据都准备好再进行处理
在这里插入图片描述
在这里插入图片描述
不能通过delete删除placementnew申请的内存空间
在这里插入图片描述

std::vector<Object> v;
v.reserve(100)
//不是代表生成了100个object,会构造一部分连续内存,当a.push_back(object())时会调用placementnew
//当a.pop_back()时调用object析构

使用placementnew的好处是内存利用率高,析构的时候不会回收到系统中,但是不能存大小不一致的东西

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值