返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >24个C++的大坑分别是哪些
  • 934
分享到

24个C++的大坑分别是哪些

2023-06-14 23:06:24 934人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关24个c++的大坑分别是哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前段时间给部门做了个C++专题的分享,主要分享了C++语言里一些常见的坑,在这里也分享给大家。以下是本

这篇文章将为大家详细讲解有关24个c++的大坑分别是哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

前段时间给部门做了个C++专题的分享,主要分享了C++语言里一些常见的坑,在这里也分享给大家。

以下是本文目录:

24个C++的大坑分别是哪些

首先说下C++和C语言有什么区别?分享一个我在知乎上看见的回答:

  • C++ ≈ C with classes, C with STL

  • C:面向机器编程

  • C++:面向编译器编程

C++有个很重要的特性叫RaiI,个人认为可以多多使用,相当方便,关于RAII巧妙使用可以看我这两篇文章《RAII妙用之ScopeExit》《RAII妙用之计算函数耗时》。

言归正传,下面我一个一个的列出来C++使用过程中常见的坑:

无符号整数的错误使用

for (unsigned int i = 10; i >= 0; --i) { ... }

上面这段代码会发生什么? 会死循环,这里要注意下无符号整数的使用。

容器的size()返回类型是无符号整数

std::vector<int> vec;vec.push_back(1);for (auto idx = vec.size(); idx >= 0; idx--) {    cout << "===== \n";}

这段代码依旧会出现死循环,原因参考上一条。

memcpy、memset只适用于POD结构

至于什么是POD类型,其实解释起来挺麻烦的,感兴趣的可以直接看cppreference的https://en.cppreference.com/w/cpp/named_req/PODType

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排序使用自己的成员方法

一般的容器排序都使用std::sort(),但是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/delete、new[]/delete[]、malloc/free严格配对

这几个一定要配对使用,原因的话可以看我之前的文章《new[]和delete[]为何要配对使用? 》

基类析构函数要是虚函数

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

注释用,而不是//

注释用,可能会出问题。原因:utf-8和ANSC(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 clear和swap问题

清空某个vector,可以使用swap而不是其clear方法,这样可以更早的释放vector内部内存。

vector<int> vec;vector<int>().swap(vec);vec.clear();

vector问题

尽量不要在vector中存放bool类型,vector为了做优化,它的内部存放的其实不是bool。

条件变量

条件变量的使用有两大问题:信号丢失和虚假唤醒,相当重要,具体可以看我这篇文章《使用条件变量的坑你知道吗》。

类型转换

在C++中尽量使用C++风格的四种类型转换,而不要使用C语言风格的强制类型转换。

异步操作中async的使用

std::async(std::launch::async, []{ f(); }); // 临时量的析构函数等待 f()std::async(std::launch::async, []{ g(); }); // f() 完成前不开始

std::async 这货返回的 future 和通过 promise 获取的 future 行为不同,async 返回的 future 对象在析构时会阻塞等待 async 中的线程执行完毕,这就导致在大部分场景中 async达不到你直觉的认为它能达到的目的。

智能指针

一个裸指针不要使用多个智能指针包裹,尽可能使用make_unique,make_shared。

当需要在类得内部接口中,需要将this作为智能指针使用,需要用该类派生自enable_shared_from_this

栈内存使用

合理使用栈内存,特别是数组,数组越界问题容易导致栈空间损坏,可以考虑使用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使用

尽量使用enum class替代enum,enum class 是带有作用域的枚举类型。

空指针使用nullptr而不是NULL

至于为什么要这么使用,可以看我这篇文章《关于nullptr这篇文章你一定要看》

void func(char*) {    cout << "char*";}void func(int) {    cout << "int";}int main() {     func(NULL); // 编译失败 error: call of overloaded ‘func(NULL)' is ambiguous    func(nullptr); // char*    return 0;}

std::remove的使用

这个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产生。

关于“24个C++的大坑分别是哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: 24个C++的大坑分别是哪些

本文链接: https://lsjlt.com/news/275790.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 24个C++的大坑分别是哪些
    这篇文章将为大家详细讲解有关24个C++的大坑分别是哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前段时间给部门做了个C++专题的分享,主要分享了C++语言里一些常见的坑,在这里也分享给大家。以下是本...
    99+
    2023-06-14
  • 总结了24个C++的大坑,你能躲过几个
    前段时间给部门做了个C++专题的分享,主要分享了C++语言里一些常见的坑,在这里也分享给大家。 以下是本文目录: 首先说下C++和C语言有什么区别?分享一个我在知乎上看见的回答: ...
    99+
    2024-04-02
  • 5个强大的HTML5 API分别是哪些
    5个强大的HTML5 API分别是哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.  全屏API(Fullscreen API)该API允许开发...
    99+
    2023-06-17
  • 10 个强大的Apache模块分别是哪些
    这期内容当中小编将会给大家带来有关10 个强大的Apache模块分别是哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Apache 是世界上使用最为广泛的 Web 服务...
    99+
    2024-04-02
  • 8种最坑的SQL错误用法分别是哪些
    8种最坑的SQL错误用法分别是哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、LIMIT 语句分页查询是最常用的场景之一,但也通常也是最...
    99+
    2024-04-02
  • 9个JavaScript技巧分别是哪些
    本篇文章为大家展示了9个JavaScript技巧分别是哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. 生成指定范围的数字在某些情况下,我们会创建一个处在两个...
    99+
    2024-04-02
  • 9个出色的JavaScript库分别是哪些
    本篇文章为大家展示了9个出色的JavaScript库分别是哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。JavaScript 从诞生伊始就在不断进化。毫无疑问,...
    99+
    2024-04-02
  • 12个优秀的JavaScript库分别是哪些
    本篇文章为大家展示了12个优秀的JavaScript库分别是哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。JavaScript有很多库,每个人有自己最喜欢、认为...
    99+
    2024-04-02
  • Python学习的十九大语法分别是哪些
    Python学习的十九大语法分别是哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python这两年可谓是大火,很多新手选择从Python入手编程界,确实没错...
    99+
    2023-06-02
  • 7个学习jQuery的网站分别是哪些
    这篇文章给大家介绍7个学习jQuery的网站分别是哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。根据国外科技网站 W3Techs 一项调查了近100万个网站数据显示,jQuery是...
    99+
    2024-04-02
  • 5个最酷的终端分页器分别是哪些
    5个最酷的终端分页器分别是哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。像日志或源代码这样的大文件可能会多达成千上万行,这使得在文件内导航非常困难,尤其是在终端上。此外,大...
    99+
    2023-06-16
  • 关于C++的坑有哪些
    这篇文章主要讲解了“关于C++的坑有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“关于C++的坑有哪些”吧!1. string的字符串拼接,导致coredump该问题的核心点在于第9行,...
    99+
    2023-06-16
  • Python的10个神奇的技巧分别是哪些
    Python的10个神奇的技巧分别是哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。尽管从表面上看,Python似乎是任何人...
    99+
    2024-04-02
  • 11个Python Pandas小技巧分别是哪些
    今天就跟大家聊聊有关11个Python Pandas小技巧分别是哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。或许本文中的某些命令你早已知晓,只是没意识到它还有这种打开方式。Pa...
    99+
    2023-06-16
  • 6个Kubernetes监视工具分别是哪些
    6个Kubernetes监视工具分别是哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。导读:监控可帮助您确保Kubernetes应用程序平稳运行并排除可能出现的任何问题。Pr...
    99+
    2023-06-04
  • 3个很棒的小众JavaScript库分别是哪些
    3个很棒的小众JavaScript库分别是哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。JavaScript有很多库,每个人都已经对最重要...
    99+
    2024-04-02
  • JavaScript的10个实用小技巧分别是哪些
    本篇文章给大家分享的是有关JavaScript的10个实用小技巧分别是哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。我一直在寻找提高效率的...
    99+
    2024-04-02
  • Java堆内存的10个要点分别是哪些
    今天就跟大家聊聊有关Java堆内存的10个要点分别是哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。当我开始学习Java编程时,我不知道什么是堆内存或堆空间,我甚至不知道当对象创建...
    99+
    2023-06-17
  • web前端三大主流框架分别是哪些
    web前端三大主流框架分别是:Angular、React和Vue.js。1、Angular是一个由Google开发的前端框架,它是一个完整的框架,包括了数据绑定、组件化、路由、依赖注入等功能;2、React是由Facebook开发的一个Ja...
    99+
    2023-08-15
  • 8个Python高效数据分析的技巧分别是哪些
    这期内容当中小编将会给大家带来有关8个Python高效数据分析的技巧分别是哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。不管是参加Kaggle比赛,还是开发一个深度学习应用,***步总是数据分析。介绍...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作