C语言
陌养
永远相信美好的事情正在发生
展开
-
new[] 使用 delete 造成内存泄漏
C++的人,肯定知道 delete 要与 new 配对使用,delete[] 要与 new [] 配对使用。平时也小心着使用,一般问题也不大。但是如果用错了会产生什么后果呢。本文先介绍new,new[] ,delete ,delete [],然后再推导出后果。转载 2023-08-14 22:06:37 · 332 阅读 · 0 评论 -
什么是GCC
GCC(GNU Compiler Collection,GNU编译器套件)是由 GNU 开发的编程语言译器。GNU 编译器套件包括 C、C++、Objective-C、Java、Ada 和 Go 语言前端,也包括了这些语言的库(如 libstdc++,libgcj等)-std=c99。原创 2023-08-07 20:43:45 · 1020 阅读 · 0 评论 -
了解隐式接口和编译期多态
class和template都支持接口与多态;对classes而言,接口是显式的,以函数签名为中心。多态则是通过virtual函数发生于运行期;对template参数而言,接口是隐式的,奠基于有效表达式。多态则是通过template具现化和函数重载解析发生于编译期。转载 2023-07-12 10:24:57 · 68 阅读 · 0 评论 -
C++中operator new、new、new operator的区别
对于operator new的重载方式而言,分为两种,一种是全局重载而另一种是类重载。全局重载是void* ::operator new(size_t size),在类中重载形式 void* A::operator new(size_t size)。而第一步中分配内存的操作由operator new(size_t)来完成的,如果类A重载了operator new,那么将调用A::operator new(size_t ),如果没有重载,就调用::operator new(size_t )。转载 2023-07-11 16:02:19 · 98 阅读 · 0 评论 -
delete 和 delete []的真正区别
如果你的类使用了操作系统资源,单纯把类的对象从内存中删除是不妥当的,因为没有调用对象的析构函数会导致系统资源不被释放,如果是Socket则会造成Socket资源不被释放,最明显的就是端口号不被释放,系统最大的端口号是65535(216 _ 1,因为还有0),如果端口号被占用了,你就不能上网了,呵呵。所以,在用这些类生成对象数组的时候,用delete[]来释放它们才是王道。此种情况中的释放效果相同,原因在于:分配简单类型内存时,内存大小已经确定,系统可以记忆并且进行管理,在析构时,系统并不会调用析构函数,转载 2023-07-11 14:45:57 · 156 阅读 · 0 评论 -
基类虚函数
基类的私有成员不可以被派生类访问,但是可以重写基类的虚函数,而且动态绑定。virtual函数系动态绑定,而缺省参数值却是静态绑定。基类私有虚函数可被派生类重写。原创 2023-07-09 11:16:14 · 113 阅读 · 0 评论 -
关于函数指针的注意事项
7、与数组类似,不能返回一个函数类型,但是可以返回一个指向函数的指针。decltype对于函数的作用与对数组的作用一样,结果都是函数类型或数组类型。5、与数组类似,不能使用函数类型作为形参,但是可以使用函数指针作为形参。并且若实参和形参都是函数类型,都会自动转换成指针。函数的类型由其返回类型和形参类型共同决定。而指针函数是指函数返回值是指针类型。4、定义了指向重载函数的指针,那么指针指向的重载函数的类型与重载函数类型要进行精确匹配。2、若想声明一个指向某个函数的指针,直接用指针替换掉函数名。转载 2023-06-14 15:10:02 · 218 阅读 · 0 评论 -
C++中的trivial和non-trivial构造/析构/拷贝/赋值函数及POD类型
POD 属性在 C++11 中往往又是构建其他 C++ 概念的基础,事实上,在 C++11 标准中,POD 出现的概率相当高。因此学习 C++,尤其是在 C++11 中,了解 POD 的概念是非常必要的。,也就是说有意义的函数,里面由一些必要的操作,比如类成员的初始化、释放内存等。POD 在 C++ 中是非常重要的一个概念,通常用于说明一个类型的属性,尤其是用户自定义类型的属性。一旦定义了构造函数,即使构造函数不包含参数,函数体里也没有任何的代码,那么该构造函数也不再是"平凡"的。转载 2023-06-12 20:08:59 · 249 阅读 · 0 评论 -
类-类型成员
4.但是在模板类中,假定T是一个模板类型参数,当编译器在实例化之前遇到类似Screen::pos的时候,它不知道这个pos是一个类型成员还是静态成员。所以C++用typename显式表示模板类中的类型成员。3.我们用作用域运算符(::)来访问static成员和类型成员,比如可以这样访问上面类的类型成员。1.类型成员与其他成员一样存在访问限制,即可用private和public进行修饰。2.定义类型成员可以使用typedef和using关键字。1.什么是类的类型成员。2.类型成员的定义方法。转载 2023-05-14 11:28:43 · 122 阅读 · 0 评论 -
C++ 参数绑定bind1st, bind2nd
今天,我们讲一讲bind1st和bind2nd。两者在C++11中均已不推荐使用,C++17中已经移除。找到vector容器中,第一个小于2的元素,以及第一个大于2的元素。C++ 参数绑定bind(适用于C++11以后)转载 2023-05-03 21:59:12 · 374 阅读 · 0 评论 -
const int *p和int * const p的区别(常量指针与指向常量的指针)
下面依次对这三种类型进行介绍。因为*操作符是左操作符,左操作符的优先级是从右到左,对于。转载 2023-03-18 15:31:41 · 104 阅读 · 0 评论 -
数组指针和指针数组的区别
因为p是个不可知的表示,只存在p[0]、p[1]、p[2]…这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]p跨过行a[0][]指向了行a[1][]//将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]转载 2023-02-28 09:43:47 · 59 阅读 · 0 评论 -
C++ fstream流的eof()使用的问题
按照一般思维,应该就是到达文件尾,就eof()应返回true,但事实上,在读完最后一个数据时,eofbit仍然是false。只有当流再往下读取时,发现文件已经到结尾了,才会将标志eofbit修改为true。既然已经知道了原因,那么,为了避免这样的情况,可以使用readfile.peek()==EOF来判断是否到达文件结尾,这样就能避免多读一行。转载 2022-09-19 21:01:24 · 1297 阅读 · 0 评论 -
C语言学习-高低位和大小端
C语言中的高位字节和低位字节是什么意思?通常从最高有效位开始自左向右书写一个数字。在理解有效位这个概念时,可以想象一下你的支票数额的第一位增加1和最后一位增加1之间的巨大区别,前者肯定会让你喜出望外。计算机内存中一个字节的位相当于二进制数的位,这意味着最低有效位表示1,倒数第二个有效位表示2×1或2,倒数第三个有效位表示2×2×1或4,依此类推。如果用内存中的两个字节表示一个16位的数,那么其中的一个字节将存放最低的8位有效位,而另一个字节将存放最高的8位有效位,见图。存放最低的8位有效位的字节被称为最转载 2020-11-14 18:25:00 · 6070 阅读 · 0 评论