6.函数调用不要作为另一个函数的参数使用,否则对于代码的调试、阅读都不利。 7.函数break,return时一定要注意资源的释放,比如释放申请的内存、释放锁。 8.禁止内存操作越界。...(3)使用memcpy/memset时一定要确保长度不要越界。 (4)字符串考虑最后的'\0',确保所有字符串是以'\0'结束。 (5)指针加减操作时,考虑指针类型长度。 (6)数组下标进行检查。...坚持下列措施可以避免内存泄漏: (1)异常出口处检查内存、定时器/文件句柄/Socket/队列/信号量/GUI等资源是否全部释放。 (2)删除结构指针时,必须从底层向上层顺序删除。...(6)检查队列中每个成员是否释放。 10.禁止引用已经释放的内存空间。 坚持下列措施可以避免引用已经释放的内存空间: (1)内存释放后,把指针置为NULL;使用内存指针前进行非空判断。...(4)自动存储对象的地址不应赋值给其他的在第一个对象已经停止存在后仍然保持的对象(具有更大作用域的对象或者静态对象或者从一个函数返回的对象)。
---- 通过实际例子说明问题,声明一个结构体中,其中包含一个数组成员。...id; char name[NAME_LENGTH_MAX]; }; 在此实例中,我们可以发现,结构体STUDENT包含不确定长度的name成员,为了避免代码访问name数组越界,不得不声明一个不可超越的长度...(其实就是原来的begin-1) 17.empty 判断vector是否为空 18.swap 与另一个vector交换数据 ---- 4....若结构体含有vector成员,也必须先对此成员初始化,否则使用时可能会导致dump。 在结构体有vector成员,不可用memset对此结构体进行清零,否则会导致内存泄漏。...在初始化后,vector就是一个指针指向了一篇连续的内存,如果使用memset对含有vector成员的结构体清零,那么就会改变vector的指向对象,那么之前的内存还没有释放就被丢失掉了,导致内存泄漏。
: 1.函数不变参数使用const 2.全局变量应增加“g_”前缀 3.静态变量应增加“s_”前缀 4.在源文件范围内声明和定义的所有函数,除非外部可见,否则应该增加static关键字 5.函数调用不要作为另一个函数的参数使用...2.字符串考虑最后的'\0',确保所有字符串是以'\0'结束 3.指针加减操作时,考虑指针类型长度 4.数组下标进行检查 5.使用时sizeof或者strlen计算结构/字符串长度,避免手工计算...C语言入门到精通 4 禁止内存泄漏: 1.异常出口处检查内存、定时器/文件句柄/Socket/队列/信号量/GUI等资源是否全部释放 2.删除结构指针时,必须从底层向上层顺序删除 3.使用指针数组时...,确保在释放数组时,数组中的每个元素指针是否已经提前被释放了 4.避免重复分配内存 5.小心使用有return、break语句的宏,确保前面资源已经释放 6.检查队列中每个成员是否释放 5 禁止引用已经释放的内存空间...(具有更大作用域的对象或者静态对象或者从一个函数返回的对象) END
题目 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。...(s 也可以看做它自身的一棵子树) 解题思路 如果根节点就相同,那么需要判断一下两个根节点的子节点是否都相同。
题目 给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。...解题思路 先比较根节点的值是否相同 && 左子树相同 && 右子树相同 代码 public boolean isSameTree(TreeNode p, TreeNode q) { if
2) 智能指针(std::shared_ptr和std::unique_ptr)即RAII最具代表的实现,使用智能指针,可以实现自动的内存管理,再也不需要担心忘记delete造成的内存泄漏。...毫不夸张的来讲,有了智能指针,代码中几乎不需要再出现delete了。 116、手写实现智能指针类 1) 智能指针是一个数据类型,一般用模板实现,模拟指针行为的同时还提供自动垃圾回收机制。...通过覆写赋值运算符,才能将一个旧的智能指针赋值给另一个指针,同时旧的引用计数减1,新的引用计数加1 2) 一个构造函数、拷贝构造函数、复制构造函数、析构函数、移走函数; 117、说一说你理解的内存对齐以及原因...1) 带有虚函数的类,每一个类会产生一个虚函数表,用来存储指向虚成员函数的指针,增大类; 2) 带有虚函数的类的每一个对象,都会有有一个指向虚表的指针,会增加对象的空间大小; 3) 不能再是内敛的函数...如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数; 4) 因为可以把调用者与被调用者分开。
几乎所有的系统底层都是用C写的,当时定义的基本数据类型比如int、char、float、枚举、指针、数组和结构等通过二进制拷贝后还能保持数据不变,即编译器可以通过二进制数据将该类型正确解析出来。...和union是否是POD类型的。...可以使用字节赋值 POD类型可以直接使用字节赋值,使用C语言库函数进行二进制形式的数据交换,包括但不限于如下操作: malloc创建 memset设置内存 memcpy和memmove拷贝内存 3....其他特性 虽然与C完全兼容,但是仍然可以有成员函数 有更长的生命周期(从资源获取到资源释放),非POD类型的生命周期从构造函数结束到析构函数结束 POD类型对象的前部没有填充字节,因此对象指针等于对象第一个成员的指针...标准布局 所有非静态数据均为标准布局类型 所有基类均为标准布局类型 所有非静态成员具有相同的访问权限 没有虚函数 没有虚基类 类中的第一个非静态成员与其任何基类的类型不同 要么所有基类都没有非静态成员,
修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在 static 函数内不能访问非静态成员。 this 指针 this 指针是一个隐含于每一个非静态成员函数中的特殊指针。...抽象类:含有纯虚函数的类 接口类:仅含有纯虚函数的抽象类 聚合类:用户可以直接访问其成员,并且具有特殊的初始化语法形式。...shared_ptr 多个智能指针可以共享同一个对象,对象的最末一个拥有着有责任销毁对象,并清理与该对象相关的所有资源。...,是一种在异常时可以帮助避免资源泄漏的智能指针。...typeid typeid 运算符允许在运行时确定对象的类型 type_id 返回一个 type_info 对象的引用 如果想通过基类的指针获得派生类的数据类型,基类必须带有虚函数 只能获取对象的实际类型
,此时就可以用函数指针数组,减少代码量 函数指针多数是在将一个函数作用参数传给另一个函数时使用,这个函数就叫回调函数 大多数情况下,指针数组都是用来存多个字符串 数组指针常用来给二维数组传参 一维数组传参...memset(arr,1,10),这个函数是把arr数组的元素更改10个字节,每个字节改成1 结构体所占内存大小计算:第一个成员变量在内存的位置就是结构体的初始位置,第二个成员变量以及后面的变量的内存位置由对齐数来决定...比如一个结构体有三个成员变量,char name,int age, char add,那么这个结构体的大小计算过程:第一个char占了一个字节,第二个int对齐数4,所以其内存位置从第4个字节开始算,第一二成员变量之间空出了三个字节的内存...,第三个char就占一个字节,然后整个结构体要是最大对齐数的整数倍,也就是12,所以这个结构体的大小是1+3+4+1=9=4*3=12 如果结构体struct People 里的成员变量是个结构体struct...上图中的SmartPointer就是自定义的智能指针,sp是局部变量,函数结束后它就通过自身的析构来释放Person的堆空间,而且通过对->和*的重载后,sp就可以当成Person来使用了 Person
类是可以组合在一起的一组属性和相关行为。对象是类的实例,表示具有属性和行为的真实实体。可以使用类数据成员来表示属性,而可以使用方法来表示行为。...“类”也是一种数据类型,可以将不同的数据类型和其对应的方法进行分类。C++中两者的区别之一是,类的所有成员默认情况下都是私有的,而结构的所有成员默认情况下都是公共的。...当一个类实例化另一个类的对象时,该关系为“ has-a”,并且此属性称为composition。 继承使两个类之间具有“is - a”关系。...在SystemVerilog中,类名前面带有虚拟关键字,以使其成为抽象类。以下是如何使用函数定义为virtual定义抽象类的示例。然后派生的类可以实现此功能。相当于一个模板类。...[116] 类的this指针是什么意思? 该指针是一个特殊的指针,可用于在类范围内引用该类的当前对象。 [117] type conversion 和 type casting的区别是?
只用于对象的指针和引用。当用于多态类型时,它允许任意的隐式类型转换以及相反过程。dynamic_cast会检查操作是否有效。也就是说,它会检查转换是否会返回一个被请求的有效的完整对象。...count_if() 带一个函数对象的参数(上面“100”的这个参数)。函数对象是一个至少带有一个operator()方法的类。这个类可以更复杂。 find(*.begin()....函数erase()删掉由一个iterator指出的元素。还有另一个erase()函数可以删掉一个范围的元素。 list的成员函数remove()用来从list中删除元素。...,放入容器中,最好不要对容器进行内存初始化(不要调用memset,zeromemory函数),否则如果结构体中有指针类型的变量时,就会出现问题。...一些temp的结构体后,执行clear这样是否会内存泄露?
答案4 2、哪些函数可能造成缓冲区溢出(考察内存,做嵌入式,内存一定要熟悉): strcat strncat strcmp strcpy 3、与或非,异或 4、内存四区 5、字符串数组是否可以比大小...后面四个是指针,他们指向的相等。...: 1、一个类的友元函数可以访问该类的(D) A私有成员 B保护成员 C公有成员 D所有成员 2、静态变量的作用域:本文件 3、进栈1234,栈的进出不可能的顺序是 6、C++中指针和引用的区别...8、异常的定义,什么时候会抛出异常 9、n个节点的单项链表(没有头节点),最少有几个指针域 11、析构函数中不能做的是:抛出异常 12、关于智能指针使用的一些注意点 13、http默认端口号:80 14...33、双向链表代码补全 36、输入几个数,从大到小输出,只输出偶数(冒泡快排都可以) 37、通过C++11模板元编程,实现一个功能判断一个模板参数是否为智能指针 公司三(主要考察C、通信、Linux)
⾯必须⾄少⼀个其他成员,比如我们上面的例子中,在柔性数组前都建立了另一个整型成员在前面 sizeof返回的这种结构大小不包括柔性数组的内存,只包含其它成员的大小,我们可以来试一下计算上面的结构体Stu:...int i; int arr[]; }Stu; 上面的代码中,我们创建了一个带有柔性数组的结构体,将其重命名为了Stu,由于我们要指定空间内容,所以我们可以把其中的i用来表示柔性数组...,不能直接用原来的指针p来接收,因为一旦realloc开辟空间失败返回了空指针,那么我们就找不到原数据了 所以我们这里重新创建一个变量tmp来接收,然后判断它是否为空,不为空再传给我们的p,如果为空那么就直接打印错误信息...其实是有问题的,因为我们这里使用了两个malloc,一个给了结构体开辟空间,另一个为结构体中的arr开辟了空间,而两次malloc开辟的空间不一定是连续的,所以我们释放时只释放了结构体的空间就不够 ...⽤free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户来发现这个事 所以,如果我们把结构体的内存以及其成员要的内存⼀次性分配好了,并返回给用户⼀个结构体指针
,使用指定初始化,一个明显的优点是成员初始化顺序和个数可变,并且扩展性好,比如增加字段时,避免了传统顺序初始化带来的大量修改。...struct A a1={1,2}; (3)构造函数初始化常见于C++代码中,因为C++中的struct可以看作class,结构体也可以拥有构造函数,所以我们可以通过结构体的构造函数来初始化结构体对象。...给定带有构造函数的结构体: struct A { A(int a,int b) { this->a=a; this->b=b; }; int...memset(&a,0,sizeof(a)); (2)依次给每一个结构体成员变量进行赋值: struct A a; a.b=1; a.c=2; (3)使用已有的结构体变量给另一个结构体变量赋值。...也就是说结构体变量之间是可以相互赋值的。
,插入了就等于1 KernelRoutine:是一个函数指针,该函数将在内核模式的 APC_LEVEL 上被执行 RundownRoutine:是一个函数指针,当一个线程终止时,如果它的 APC...如果RundownRoutine 成员非空,则调用它所指的函数。 NormalRoutine:指向一个在 PASSIVE_LEVEL 上执行的函数。...在这三个函数指针成员中,只有KernelRoutine域是必须的 RundownRoutine 和 NormalRoutine都是可选的。...内核模式的APC并不要求从目标线程获得许可就可以运行在该线程的环境中,而用户模式的APC必须先获得许可才可以。内核模式的APC无需目标线程的干涉或者同意,就可以中断该线程并执行一个过程。...一个线程要想进制普通类型的APC,唯一的办法是调用KeEnterCriticalRegion,它会设置该线程的KTHREAD结构中的KernelAPCDisable域。
,使用指定初始化,一个明显的优点是成员初始化顺序和个数可变,并且扩展性好,比如增加字段时,避免了传统顺序初始化带来的大量修改。...struct A a1={1,2}; 1 (3)构造函数初始化 常见于C++代码中,因为C++中的struct可以看作class,结构体也可以拥有构造函数,所以我们可以通过结构体的构造函数来初始化结构体对象...给定带有构造函数的结构体: struct A { A(int a,int b) { this->a=a; this->b=b; }; int b; int c; } 那么结构体对象的初始化可以像类对象的初始化那样...A a; memset(&a,0,sizeof(a)); (2)依次给每一个结构体成员变量进行赋值: struct A a; a.b=1; a.c=2; (3)使用已有的结构体变量给另一个结构体变量赋值...也就是说结构体变量之间是可以相互赋值的。
然而在没养成良好编程习惯或者遵守编程规范的时候,往往只考虑实现功能,而没有考虑过内存泄露。 不禁回想起硕士期间开发的机器人仿真软件,为了论文需要,我专门增加了一个实时显示软件占用内存的模块。...还有的时候,是可能在某个过程把一段分配的内存赋给了另一个指针,free了原来的指针后操作另一个指针会有风险。...memset(buffer1, 0, BUFFER_SIZE); free(buffer1); buffer1 = NULL; free只是告诉编译器,buffer指定的内存可以被重新分配了...关于malloc分配内存,还有一个tip 同事在review我改的代码,提示我在为一个带有指针变量的结构体malloc一段内存后,如果这个结构体变量要作为传入的参数,在使用之前,应该先memset为0,...否则里面的指针值是随机或者未知的,作为传入参数,可能有风险。
引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用。 指针在任何时候都可以改变为指向另一个对象。 引用的创建和销毁并不会调用类的拷贝构造函数。...2.9 memset,memcpy和strcpy的区别 memset用来对一段内存空间全部设置为某个字符。 memcpy是内存拷贝函数,可以拷贝任何数据类型的对象。...联合类型操作数的sizeof是其最大字节成员的字节数。 结构类型操作数的sizeof是这种类型对象的总字节数。 如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。...在实际编程中不需要了解在我们的系统上空指针到底是一个 0指针还是非0地址,我们只需要了解一个指针是否是空指针就可以了——编译器会自动实现其中的转换,为我们屏蔽其中的实现细节。...3.11 引用与多态的关系 引用就是对象的别名。 引用主要用作函数的形参。 引用必须用与该引用同类型的对象初始化: 引用是除指针外另一个可以产生多态效果的手段。
2.2 包含指针的结构体大小 对于普通数据类型的结构体,计算结构体的的大小是件容易的事。但是,如果是有包含有指针的结构体呢?我想,很多跟我一样的菜鸟都会犯错。...可以看到,无论我们为name赋值多么长的字符串,存储的永远只是一个指向具体字符串的指针,也就是一个地址(一个神奇的数字),结构体的大小不会因为具体指向的字符串的大小而变化。..._Person ); 这样显得比较麻烦,可以借助typedef来取一个别名: typedef struct _Person { char *name; // 指针为4个字节,地址(int...于是,这时我们就可以使用一个指向结构体的指针来实现。...printf("Address : %d , %d\n",&p1,p3); 这里需要注意的就是,对于结构体指针,取成员要使用 -> 而不是 .
领取专属 10元无门槛券
手把手带您无忧上云