c++的坑

2023-05-16

for (unsigned int i = 10; i >= 0; --i) { ... } 
会死循环
例子:
std::vector<int> vec; 
vec.push_back(1); 
for (auto idx = vec.size(); idx >= 0; idx--) { 
    cout << "===== \n"; 
} //死循环
STL遍历删除时注意迭代器失效问题

void erase(std::vector<int> &vec, int a) { 
    for (auto iter = vec.begin(); iter != vec.end();) { // 这个正确 
        if (*iter == a) { 
            iter = vec.erase(iter); 
        } else { 
            ++iter; 
        } 
    } 
 
    for (auto iter = vec.begin(); iter != vec.end(); ++iter) {  // error 
        if (*iter == a) { 
            vec.erase(iter); // error 
        } 
    } 
} 
std::list排序使用自己的成员方法
int main() { 
    std::list<int> list{1, 2, 3, 2}; 
    list.sort(); 
    // std::sort(list.begin(), list.end()); 
    for (auto i : list) { 
        std::cout << i << " "; 
    } 
    std::cout << "\n"; 
    return 0; 
} 
new/deletenew[]/delete[]、malloc/free严格配对
基类析构函数要是虚函数

如果不是虚函数的话,可能会有内存泄漏的问题

注释用/**/,可能会出问题。原因:utf-8ANSC(GB2312)编码混乱后,中文注释就乱码了,乱码中藏着 */,匹配错了,导致IDE实际注释的部分并非肉眼所见,定位极其困难,常见于Windows中。

成员变量没有默认初始化行为,需要手动初始化。
不要返回局部变量的指针或引用
char* func() { 
    char a[3] = {'a', 'b', 'c'}; 
    return a; 
} 
使用返回值优化解决
浮点数判断是否相等问题
float f; 
if (f == 0.2) {} // 错误用法 
if (abs(f - 0.2) < 0.00001) {} // 正确用法 
清空某个vector,可以使用swap而不是其clear方法,或者使用clear后用shrink_to_fit清空capacity
vector<int> vec; 
vector<int>().swap(vec); 
vec.clear(); 
尽量不要在vector中存放bool类型,vector为了做优化,它的内部存放的其实不是bool
条件变量的使用有两大问题:信号丢失和虚假唤醒,相当重要,https://zhuanlan.zhihu.com/p/271117445
在C++中尽量使用C++风格的四种类型转换,而不要使用C语言风格的强制类型转换。
异步操作中async的使用
std::async(std::launch::async, []{ f(); }); // 临时量的析构函数等待 f() 
std::async(std::launch::async, []{ g(); }); // f() 完成前不开始 

合理使用栈内存,特别是数组,数组越界问题容易导致栈空间损坏,可以考虑使用std::array替代普通的数组。
std::thread的使用一定要记得join或这detach,否则会crash。
void func() {} 
int main() { 
    std::thread t(func); 
    if (t.joinable()) { 
        t.join(); // 或者t.detach();  
    } 
    return 0; 
} 

尽量使用enum class替代enumenum class 是带有作用域的枚举类型。
空指针使用nullptr而不是NULL
这个remove其实并没有真正的删除元素,需要和erase配合使用
bool isOdd(int i) { return i & 1; } 
 
void print(const std::vector<int>& vec) { 
    for (const auto& i : vec) { 
        std::cout << i << ' '; 
    } 
    std::cout << std::endl; 
} 
 
int main() { 
    std::vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 
    print(v); 
 
    std::remove(v.begin(), v.end(), 5);  // error 
    print(v); 
 
    v.erase(std::remove(v.begin(), v.end(), 5), v.end()); 
    print(v); 
 
    v.erase(std::remove_if(v.begin(), v.end(), isOdd), v.end()); 
    print(v); 
} 
全局变量初始化问题
不同文件中的全局变量初始化顺序不固定,全局变量尽量不要互相依赖,否则由于初始化顺序不固定的问题,可能会导致bug产生。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++的坑 的相关文章

随机推荐

  • Python-Django-模型

    一 ORM 模型介绍 1 ORM 模型 对象关系映射 xff08 英语 xff1a Object Relational Mapping xff0c 简称ORM xff0c 或ORM xff0c 或OR mapping xff09 xff0c
  • LeetCodeWeeklyContest-159

    最近看了篇文章 xff0c 文章里说 希望你身边能有个比你聪明五倍 xff0c 但却比你还努力十倍的人 倍数虽然有些夸张 xff0c 但是这个思想还是能get到的 5230 缀点成线 在一个 XY 坐标系中有一些点 xff0c 我们用数组
  • 获取安卓设备唯一标识方法总结

    安卓设备的唯一标识的方法并不唯一 xff0c 也没有哪种方法能够适用于所有的Android设备 xff0c 下面列出几种常见的方式 xff0c 可以根据需要选择 1 IMEI 码 IMEI xff08 国际移动设备识别码 xff09 唯一编
  • Anaconda安装及环境变量配置(Ubuntu)

    安装Anaconda 下载软件 Anaconda下载地址打开终端 xff0c 进入到安装包的存放路径输入命令 xff1a span class token function bash span namexxxxx span class to
  • 快速幂——原理及实现

    这篇文章讲一下快速幂的问题 xff1b 首先问一个简单的问题 xff1a 23是几 xff1f 很简单啊 xff0c 是不是 xff1f 答案是8 xff1b 那么是怎么得来的呢 xff1f 222 61 8 xff1b 连续乘了3次2 x
  • 适合小白的几个入门级Python ocr识别库

    1 pytesseract 2 PaddleOCR 3 easyocr 4 muggle ocr 5 dddd ocr 6 其他 工作生活中经常会遇到需要提取图片中文字信息的情况 xff0c 以前都是手动自己把图片里的字敲出来 xff0c
  • WSL使用中遇到坑

    1 开机启动配置项 在WSL中配置的一些服务如nginx xff0c mysql xff0c ssh等 xff0c 每次开机都会需要手动开启 xff0c 参考网上的开机服务配置都是通过往 etc rc local里面添加启动脚本 xff0c
  • 云服务器Ubuntu(无桌面)安装远程桌面

    如果主机上安装的ubuntu是桌面版 xff0c 打开桌面共享即可使用Windows的远程桌面进行链接 详细参考ubuntu20 10中设置桌面共享的三种方式 任选其一 的第一部分 本文主要说明如何在Ubuntu云服务器上安装远程桌面 一
  • win10解决photoshop打不开问题

    win10 的权限跟win7有些地方不一样 xff0c 对于一直使用win7的人可能很不习惯 xff0c 我在win10上面用photoshop的时候 xff0c 出现打不开photoshop的时候 xff0c 如果你也有类似的情况 xff
  • iOS UIAlertController控件

    UIAlertController取代UIAlertView和UIActionSheet xff0c 用于界面弹出一个警告视图 初始化方法 xff0c UIAlertControllerStyle分为UIAlertControllerSty
  • 用递归和非递归实现斐波那契数列(C语言)

    斐波那契数列 xff08 Fibonacci sequence xff09 xff0c 又称黄金分割数列 因数学家列昂纳多 斐波那契 xff08 Leonardoda Fibonacci xff09 以兔子繁殖为例子而引入 xff0c 故又
  • cmd设置全局环境变量和用户环境变量

    register env bat 64 echo off echo add sg generator evn 输出空行echo set generator home 61 cd echo SG GENERATOR HOME generato
  • 如何下载4399游戏到本地并修改数值

    一直很纠结mac不能玩什么游戏 xff0c 只能通过4399来解乏了 8过4399的页面过于臃肿 xff0c 无法安心玩游戏 xff0c 于是有了这个想法 至于修改数值嘛 xff0c 嘿嘿 测试环境 xff1a mac air m1 43
  • g++版本控制,apt安装g++11

    安装g 43 43 11 span class token function sudo span add apt repository y ppa ubuntu toolchain r test span class token funct
  • git设置代理

    设置全局代理 http span class token function git span config global https proxy http 127 0 0 1 1080 https span class token func
  • Collecting package metadata (current_repodata.json)解决方法

    先运行命令conda clean i看看是否有效 删除 condarc文件 使用 conda config set show channel urls true 重新生成
  • postgresql page页结构

    前言 postgresql 保存数据的基本单位是 page xff0c 一个 page 里包含多条数据 postgresql 同磁盘的读写单位也是 page xff0c 一个 page 对应于磁盘的一个 block block 的格式和 p
  • StringPiece谷歌实现

    typedef BasicStringPiece span class token operator lt span std string span class token operator gt span StringPiece span
  • c++正则表达式

    https blog csdn net qq 62309585 article details 126776015 对字符串内容进行匹配的最常见手段就是使用正则表达式 可惜在传统 C 43 43 中正则表达式一直没 有得到语言层面的支持 x
  • c++的坑

    span class token keyword for span span class token punctuation span span class token keyword unsigned span span class to