编程语言
文章平均质量分 90
&后来&
记录每一个灵感的瞬间
展开
-
c++中内存泄漏的几种情况
c++中内存泄漏的几种情况1. 在类的构造函数和析构函数中没有匹配的调用new和delete函数两种情况下会出现这种内存泄露:一是在堆里创建了对象占用了内存,但是没有显示地释放对象占用的内存;二是在类的构造函数中动态的分配了内存,但是在析构函数中没有释放内存或者没有正确的释放内存2. 没有正确地清除嵌套的对象指针3. 在释放对象数组时在delete中没有使用方括号方括号是告诉编译器这个指针指向的是一个对象数组,同时也告诉编译器正确的对象地址值病调用对象的析构函数,如果没有方括号,那么这个指针就被默转载 2020-08-30 10:31:50 · 967 阅读 · 0 评论 -
STL源码剖析---红黑树原理详解下
算法导论书上给出的红黑树的性质如下,跟STL源码剖析书上面的4条性质大同小异。1、每个结点或是红色的,或是黑色的2、根节点是黑色的3、每个叶结点(NIL)是黑色的4、如果一个节点是红色的,则它的两个儿子都是黑色的。5、对于每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑色结点。从红黑树上删除一个节点,可以先用普通二叉搜索树的方法,将节点从红黑树上删除掉,然后再将被破坏的红黑性质进行恢复。我们回忆一下普通二叉树的节点删除方法:Z指向需要删除的节点,Y指向实质结构上被删除的结点,如果转载 2020-08-25 22:19:41 · 152 阅读 · 0 评论 -
STL源码剖析---红黑树原理详解上
原文地址:http://blog.csdn.net/hackbuteer1/article/details/7740956一、红黑树概述红黑树和我们以前学过的AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。不过自从红黑树出来后,AVL树就被放到了博物馆里,据说是红黑树有更好的效率,更高的统计性能。这一点在我们了解了红黑树的实现原理后,就会有更加深切的体会。红黑树和AVL树的区别在于它使用颜色来标识结点的高度,它所追求的是局部平衡而不是AVL树中的非常严转载 2020-08-24 20:25:36 · 166 阅读 · 0 评论 -
STL源码剖析---list
原文链接:https://blog.csdn.net/Hackbuteer1/article/details/7726116相较于vector的连续线性空间,list就显得复杂许多,它的好处是每次插入或删除一个元素,就配置或释放一个元素空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素移除,list永远是常数时间。list不仅是一个双向链表,而且还是一个环状双向链表。另外,还有一个重要性质,插入操作和接合操作都不会造成原有的list迭代器失效,这在vecto转载 2020-08-24 20:19:54 · 143 阅读 · 0 评论 -
C/C++哪些情况下会发生CoreDump?
CoreDumpcoredump是指当程序出错而异常中断时,OS会把程序工作的当前状态存储成一个coredunmp文件。通常情况下coredump文件包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息等。百度百科常见造成程序coredump的原因内存访问越界的问题(最典型的比如数组下标越界)堆栈溢出(使用了过大的局部变量,因为局部变量存储在栈中,容易导致溢出;函数递归的深度太大等等)非法指针(比如随意的强制转换指针的类型,或者使用了空指针)多线程同时读写某一个变量时,没有加线程锁。原创 2020-08-18 21:39:46 · 4413 阅读 · 0 评论 -
STL源码分析--迭代器失效小结
原文链接:https://blog.csdn.net/Hackbuteer1/article/details/7734382迭代器(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理解成为一个指针。但它又不是我们所谓普通的指针,我们可以称之为广义指针,你可以通过sizeof(vector::iterator)来查看,所占内存并不是4个字节。首先对于vector而言,添加和删除操作可能使容器的部分或者全部迭代转载 2020-07-05 11:34:22 · 97 阅读 · 0 评论 -
STL源码剖析---空间配置器
原文链接:https://blog.csdn.net/Hackbuteer1/article/details/7724534看过STL空间配置器的源码,总结一下:1、STL空间配置器:主要分三个文件实现,stl_construct.h 这里定义了全局函数construct()和destroy(),负责对象的构造和析构。stl_alloc.h文件中定义了一、二两级配置器,彼此合作,配置器名为alloc. stl_uninitialized.h 这里定义了一些全局函数,用来填充(fill)或复制(copy转载 2020-07-05 10:56:56 · 114 阅读 · 0 评论 -
STL源码剖析--vector
原文链接:https://blog.csdn.net/Hackbuteer1/article/details/7724547vector容器概述vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切琐细都得由客户端自己来:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,转载 2020-07-05 10:54:04 · 119 阅读 · 0 评论 -
C++ 面试知识准备
C++中指针和引用的区别1.本质区别:(1)指针为指向一个变量的地址(2)引用为变量的别名,实质还是变量。2.使用方式区别:(1)引用需要初始化,且初始化后不可更改,指针可以为空,并且可以改变(2)可以有const 指针,没有const引用(3)指针可以有多级,引用只有一级(4)如果返回动态分配的对象或变量,应当返回指针,返回引用可能导致内存泄漏(5)参数传递:指针作为函数参数传递时,本质是值传递,传递的是值的地址,会将实参拷贝给形参,可以直接取地址改变原先变量引用作为函数参数传递时,原创 2020-05-11 12:13:15 · 181 阅读 · 0 评论 -
Effective C++笔记(二)
条款03:尽可能用constconst的作用(1)变量常量,该变量不可被修改, 因此定义时必须被初始化(2)指针常量指针和指针常量允许非const对象的地址赋给指向const对象的指针因此可以简单的理解为,谁被const修饰,谁就不能改变。没有被修饰的不可轻易下结论。#常量指针const int a = 0;const int *p = &a; # p本身并不是常量,...原创 2020-01-01 17:48:49 · 180 阅读 · 0 评论 -
C++中new用法总结
前段时间复习面试的时候,看到这个问题经常有问到,我这个小白就看了些博客和书,总结一下。new可以说是个一个关键字,也可以说是一个运算符,并且可以被重载。1、new operator这个就是平时最经常用的new,用法如下程序所示:class A{public: A(int i) :a(i){}private: int a;};int main(){ A*...转载 2020-04-30 20:07:29 · 907 阅读 · 0 评论 -
Effective C++笔记(一)
条款02:尽量以const,enum,inline替换#define为什么尽量不用#define?(1)#define的记号名称可能在编译器处理源码时就已经被预处理器移走了,记号名称未能进入记号表,从而可能获得编译错误的信息。如果又是定义在非你所写的头文件中,你更将毫无概念,并耗时追踪。(2)无法用#define创建一个class专属常量,#define并不注重于(scope),一旦编译除...原创 2019-12-31 20:15:26 · 136 阅读 · 0 评论