网站首页 > 技术文章 正文
相信大家在刚刚学习编程的过程中一定遇到过大片的红色吧,这些让大家看着头疼的报错却是大家成长的见证呢,这里帮大家总结一下那些经常遇到的报错。
1、FORWARD_NULL
通常发生的情况是,一个指针先被判断是否等于NULL,然后指针被非法引用。
非法引用NULL的指针会导致程序崩溃。程序员在判断指针是否等于NULL时,没能正确的处理好,或者是忘记了NULL在代码路径的情况。
2、USE_AFTER_FREE
即使用已被释放的内存、同一指针被释放多次。
当内存被释放后,就不能再被安全的使用。而同一内存的多次释放通常会导致未定义的行为,包括内存冲突和程序崩溃。
引用已释放的指针也是非常危险的,因为指针的值不确定或者指针指向任意内存的位置。
在多线程的程序中,多次释放同一内存非常危险,因为已释放的内存可能已被另一线程申请,再次释放可能导致该线程的内存也被释放,在这种情况下,该线程使用已释放的内存,可能导致紊乱,同时很难被编译器跟踪。
3、RESOURCE_LEAK
资源泄漏(内存泄漏)指变量在出了自己的作用范围后,占用的资源仍然驻守在内存里,没有被释放。
严重的内存泄漏能导致进程崩溃,即便是很小的内存泄漏,在系统长时间运行没有重启后,也会产生错误。如果内存泄漏是由用户输入或者网络数据触发,还会成为“拒绝服务攻击”的对象。
文件句柄或者网络套接字的泄漏会导致程序崩溃、拒绝服务攻击或者打开其他文件或套接字失败。操作系统通常会限制进程的文件句柄和套接字个数。当达到限制的最大值时,进程要申请新的资源时,首先要关闭一些已打开的资源。如果进程中存在资源泄漏,进程自己将没有办法回收这些资源,除非强行终止该进程。
多数情况下,这些泄漏通常发生在某个错误的路径,比如说,某个异常处理的分支。这种情况下,正确的做法应该是将程序跳转(GOTO)到该函数的出口,出口处应释放这些资源。
在C++中,RAII(the Resource Acquisition Is Initialization)机制能够自动的释放资源。RAII包括类的一个申请资源的构造函数和释放资源的析构函数。当一个类的局部变量声明后,当离开该变量的作用范围后,RAII会自动调用其析构函数释放资源,这同样也会保护throw异常导致的泄漏。
4、NULL_RETURN
函数的返回值可能是NULL,所以使用函数返回值的变量一定要首先检查是否是NULL,否则就可能出错。
程序员经常不会去检查函数的返回值,而是直接以危险的方式去使用,可能会由于对NULL的非法引用,导致程序崩溃。
5、error C2143:语法错误:缺少“;”(在“*”的前面)
该错误主要是某类型数据未include,可能是都文件拼写错误、或者头文件名已经更改、或是头文件忘记“;”
解决办法:检查头文件是否更名、是否忘记结束的“;”
6、error C1010:查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h”
解决办法:在报错行所在的文件的最前面添加“#include "StdAfx.h”
7、error C1189:出现了WINDOWS.H already included. MFC apps must not #include 的处理办法。
解决办法:把#include提到最前面去就可以编译成功了。
8、error LNK2005: _DllMain@12 already defined in dllmain.obj
解决办法:你只需要在工程设置里面把WIN32,NDEBUG,_WINDOWS,_MBCS,_USRDLL,MSGBOX_EXPORTS,_WINDLL,_AFXDLL
中的_USRDLL,删除,就可以正确编译了 。
编程的学习本身就是离不开报错的,就算是大牛们也会遇到报错,面对报错不要慌张,根据报错去更好的完善自己的程序,让自己的程序更加的完美,为了帮助大家更好的学习,这里也是帮助大家整理了一些c/c++相关的基础知识点资料,还有相关的项目实战讲解资料,感兴趣的可以私聊分享更多。希望大家能够在报错和不断的实践中做的更好,成功一直都是给肯坚持的人准备的。
- 上一篇: C语言-NULL、\0、0引发的思考
- 下一篇: 无锁队列的几种实现及其性能对比
猜你喜欢
- 2025-01-07 MACD追踪主力!超强MACD,让你一眼看穿主力动向!附指标公式
- 2025-01-07 Hive的10种常用优化总结,再也不怕MapReduce分配不均了
- 2025-01-07 使用C++编写的整蛊人的程序两例
- 2025-01-07 C语言中空指针和NULL关系是什么?
- 2025-01-07 垃圾回收器 G1 详解
- 2025-01-07 盘点c++几种常见的设计模式及具体实现
- 2025-01-07 10问10答:你真的了解线程池吗?
- 2025-01-07 EXPMA选股法
- 2025-01-07 无锁队列的几种实现及其性能对比
- 2025-01-07 C语言-NULL、\0、0引发的思考
- 最近发表
-
- 用Cursor开启JAVA+AI生涯_javascirpt怎么开启
- 大数据调度服务监控平台_大数据调度是什么意思
- SpringBoot、MyBatis、Vue搭建一个Java企业应用开源框架源码分享
- 大数据技术之Flume_大数据volume的含义
- Jenkins运维之路(Slave容器节点)_jenkins slave工作原理
- 程序员自救指南:IDEA 卡成狗?我的 9G 堆内存调参表让你起飞 附避坑
- JMeter:一个简单的测试计划怎么做?
- Windows 命令行终端 PowerShell 美化计划
- JDK25即将发布!新特性概览_jdk52.0
- JDK 25 新特性极简总结(2025 年 9 月 16 日发布,LTS 长期支持)
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (77)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)