- 博客(65)
- 收藏
- 关注
转载 空类
1. 概念:所谓的“空类”是一个class/struct类型,它没有非静态成员变量(静态成员不会增加类实例的大小),也没有虚拟函数(会导致虚表指针)最简单的空类:class empty1{}; 像empty1这样仅有类声明而没有任何其他东西的真正“空类”确实没有用,但有另外许多很有用的“空类”:它们被编译器认为是“空类”,但实际上却不是“空类”,可以包含许多有用的功能,但类实例却不会占
2017-08-02 10:23:28
750
转载 delete和delete[]
>练习 14.11 中提到: Account *parray=new Account[100]; delete parray; delete [] parray; 方括号的存在会使编译器获取数组大小(size)然后析构函数再被依次应用在每个元素上,一共size次。否则,只有一个元素被析构。 无论哪种情况,分配的全部空间被返还给自由存储区。
2017-06-14 10:03:06
514
转载 内部链接和外部链接
编译单元首先让我们来认识一下编译单元,什么是编译单元呢?简单来说一个cpp文件就是一个编译单元。在集成式的IDE中,我们往往点击一下运行便可以了,编译的所有工作都交给了IDE去处理,往往忽略了其中的内部流程事实上编译每个编译单元(.cpp)时是相互独立的,即每个cpp文件之间是不知道对方的存在的(不考虑#include “xxx.cpp" 这种奇葩的写法)编译器会分
2017-06-07 10:45:06
465
转载 进程间通信,同步
进程间通信# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某
2017-03-17 18:58:38
283
转载 线程安全和可重入函数(备忘)
在多线程编程和信号处理过程中,经常会遇到可重入(reentrance)与线程安全(thread-safe)。很多人纠结于reentrance和thread-safe两个概念理解纠缠不清。我想救我对reentrance和thread-safe的理解作个总结一、可重入(reentrance)首先来看下APUE中,列出的可重入函数:acce
2017-03-02 19:26:53
236
转载 new,operator new和placement new
new operator/delete operator就是new和delete操作符,而operator new/operator delete是函数。new operator(1)调用operator new分配足够的空间,并调用相关对象的构造函数(2)不可以被重载operator new(1)只分配所要求的空间,不调用相关对象的构造函数。当无法满足所要求分配的空间时,则
2016-07-22 11:45:49
243
原创 shared_ptr的缺陷:内存泄露
循环引用或者自引用容易造成内存泄露,可以使用weak_ptr避免class CBase2;class CBase{public: CBase(int m = 0) : nValue(m){ cout << "CBase()" << endl; } ~CBase(){ cout << "~CBase()" << endl; } int nValue; shared_ptr pt;
2016-07-20 17:49:10
2480
转载 auto_ptr实现
#ifndef AUTO_PTR_H#define AUTO_PTR_Htemplateclass auto_ptr{ public : //使用explicit关键字避免隐式转换 explicit auto_ptr(T* p=0); ~auto_ptr(); //使用另一个类型兼容的auto_ptr来初始化一个
2016-07-19 20:54:14
219
转载 operator new 和 delete
在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢?new 和 delete 是函数吗?new [] 和 delete [] 又是什么?什么时候用它们?你知道 operator new 和 operator delete 吗?为什么 new [] 出来的数组有时可以用 delete 释放有时又不行?…如果你对这些问题都有疑问的话,
2016-07-19 16:31:47
239
转载 new内存分配失败
我们都知道,使用 malloc/calloc 等分配内存的函数时,一定要检查其返回值是否为“空指针”(亦即检查分配内存的操作是否成功),这是良好的编程习惯,也是编写可靠程序所必需的。但是,如果你简单地把这一招应用到 new 上,那可就不一定正确了。我经常看到类似这样的代码: int* p = new int[SIZE]; if ( p == 0 ) // 检
2016-07-19 11:17:35
1130
转载 进程通信和线程通信
Linux系统中的进程间通信方式主要以下几种:同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程通信方式:包括信号量(Semaphore), 消息队列(Message Queue), 和共享内存(Shared Memory)网络主机间的进程通信方式
2016-07-18 10:28:04
232
转载 信号量与互斥锁
信号量与互斥锁信号量与普通整型变量的区别:①信号量(semaphore)是非负整型变量,除了初始化之外,它只能通过两个标准原子操作:wait(semap) , signal(semap) ; 来进行访问;②操作也被成为PV原语(P来源于Dutch proberen"测试",V来源于Dutch verhogen"增加"),而普通整型变量则可以在任何语句块中被访问; 信号量
2016-07-18 10:24:25
262
转载 智能指针的设计与实现
一、智能指针 在C++语言编程时,当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝;另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享。 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计
2015-12-08 12:14:28
369
转载 Trie树实现
Trie树也称字典树,因为其效率很高,所以在在字符串查找、前缀匹配等中应用很广泛,其高效率是以空间为代价的。一.Trie树的原理 利用串构建一个字典树,这个字典树保存了串的公共前缀信息,因此可以降低查询操作的复杂度。 下面以英文单词构建的字典树为例,这棵Trie树中每个结点包括26个孩子结点,因为总共有26个英文字母(假设单词都是小写字母组成)。 则可声明包含Tr
2014-11-15 18:50:16
379
原创 2-bitmap实现海量数据查找不重复数据
#include#includeusing namespace std;#define MAX 100000unsigned array[MAX];void init(){ memset(array, 0, MAX * sizeof(unsigned));}void set(unsigned i){ array[i >> 5] |= 0x01 << (i & 31);
2014-11-15 12:37:46
549
转载 位图法bitmap
1j定义 bitmap是通过1个位表示一个状态,比如:int类型有2^32个数字,即4G个数字,那么每个数字一个状态,就是2^32个bit,即512 MB。3、应用 · 给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中 首先,将这40亿个数字存储到bitmap中,然后对于给出的数,判断是否在bi
2014-11-14 15:00:27
338
转载 strlen和sizeof区别
Sizeof与Strlen的区别与联系(转) 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。 该类型保证能容纳实现所建立的最大对象的字节大小。 2.sizeof是算符,strlen是函数。 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。 sizeof
2014-11-12 09:48:21
274
转载 strcpy,strncpy,strlcpy,strdup介绍
1. strcpystrcpy函数的原型是:char * strcpy(char* dest, const char* src)strcpy的实现经常要注意的细节是:(1)判断地址是否为空(2)参数只有两个地址,没有拷贝的长度。拷贝到'\0‘时就会终止,要保证最终dest末尾是'\0'。(3)要保证目标字串的长度足够,能够容纳原串的长度。(
2014-11-09 16:46:36
519
转载 atoi函数实现
参考代码:int atoi(const char *str){ if(str == NULL || *str == '\0') { printf("invalid input\n"); return 0; } int sign = 1; int sum = 0; if(*str == ' ') ++str; if(*str == '+') ++str; else if
2014-10-26 19:52:22
400
原创 二叉树的遍历
#include#include#include#includeusing namespace std;typedef struct BiTree{ int data; BiTree *lchild; BiTree *rchild;}BiTree, *LNode;typedef struct BiTreePost{ LNo
2014-10-10 22:08:12
290
转载 二叉排序树
1.二叉排序树的概念: 二叉排序树是一种动态树表。 二叉排序树的定义:二叉排序树或者是一棵空树, 或者是一棵具有如下性质的二叉树: ⑴ 若它的左子树非空,则左子树上所有结点的值均小于根结点的值; ⑵ 若它的右子树非空,则右子树上所有结点的值均大于根结点的值; ⑶ 左、右子树本身又各是一棵二叉排序树。二叉排序树的性质: 按中序遍历二叉排序树,
2014-09-29 22:12:06
409
转载 memcpy和memmove的区别和联系
memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但复制后src但这也增加了一点点开销。memmove的处理措施:(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝
2014-09-23 21:34:15
314
转载 虚函数实现细节
1.虚函数·虚表是怎么实现的?虚表存放在哪里?·虚表中的数据是在什么时候确定的?·对象中的虚表指针又在什么时候赋值的?我们很难通过 C++语言本身来找到答案。 C++标准给编译器实现者定义了语法规范,但是被并没有定义如何实现这些语法规范,不同的编译器实现者可能有不同的实现方法,可以肯定的是他们的编译器必须符合这些语法规范。汇编语言作为最接近机器语言的计算机语言,可以为我们揭示一
2014-09-17 20:51:25
362
转载 操作系统面试题总结
1、什么是进程(Process)和线程(Thread)?有何区别? 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的
2014-09-16 16:21:23
368
转载 求两个字符串的最长子序列
方法:动态规划.循环遍历两个字符串,查找当s1[i]==s2[k] 的情况 然后保存在c[i][k]中,c[i][k]=c[i-1][k-1]+1 最后我们会得到类似以下矩阵
2014-09-16 15:34:25
779
转载 二叉树的最长路径
递归 int Depth(BiTree T)/* 深度 */ { if(T==NULL) return(0); return 1+(Depth(T->lchild)>Depth(T->rchild)? Depth(T->lchild):Depth(T->rchild)); //选择左右孩子深度高的然后加上根节点这一层就是深度了}void Long(BiTree T)
2014-09-15 21:00:01
438
转载 排序算法比较
排序方法最好时间平均时间最坏时间辅助存储稳定性备注简单选择排序O(n2)O(n2)O(n2)O(1)不稳定n小时较好直接插入排序O(n)O(n2)O(n2)O(1)稳定大部分已有序时较好冒泡排序O(n
2014-09-14 20:53:00
613
转载 面向对象和基于对象区别
面向对象和基于对象的区别是多态,和继承无关。 基于对象仅仅支持了抽象数据类型的功能,继承也不过体现了一种is-a的关系,也是抽象数据类型,只是建立了一个层次体系。但是什么是面向对象呢?就是根据对象的实际类型不同,可以自动完成不同的行为,而仅仅通过一致的调用形式。换句话说,也就是虚函数实现的多态。以上观点,在OO设计中已经得到了公认,多态的另一种实现方法是泛型。 “面向对象”和“基于
2014-09-14 09:26:25
901
转载 const常量
在C语言中,用const定义的常量其实是值不能修改的变量,因此会给它分配存储空间;但是在C++中,const定义的常量要具体情况具体对待:对于基本数据类型的常量,编译器会把它放到符号表中而不分配存储空间,而ADT/UDT的const对象则需要分配存储空间(大对象)。还有一些情况下也需要分配存储空间,例如强制声明为extern的符号常量或取符号常量的地址等操作。
2014-09-09 09:01:15
310
转载 C++中的const引用和非const引用
(1) 在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用。1 int ival = 1092;2 int &re = ival; //ok3 int &re2 = &ival; //错误4 int *pi = &ival;5 int
2014-09-09 08:50:03
437
转载 赋值运算符重载为什么要返回引用
一、c/c++赋值运算符的本意为“返回左值的引用”(左值:赋值号左面的变量而非其值)例:int a, b = 3, c = 2; (a = b) = c; cout对于a = b(a,b均为对象时),若不返回左值的引用,将会生成临时对象。如果不处理a = b = c这样的表达式,也会正常(只是会调用拷贝构造函数和析构函数处理临时对象)。二、为了
2014-09-09 08:42:03
3662
转载 重载 、覆盖、隐藏的区别
《高质量C++/C编程指南》已经清晰的列出了重载函数的特性: (1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual关键字可有可无。 因为函数参数不同,可以简单的理解为:两个重载函数是不同的函数,调用者能够明确的根据不同的参数来调用不同的函数。那么如果存在这样两个函数,编译器怎么
2014-09-06 21:35:31
270
转载 求一个整数的二进制中1的个数
求一个整数的二进制中1的个数 收藏题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。一个很基本的想法是,我们先判断整数的最右边一位是不是1。接着把整数右移一位,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1。这样每次
2014-09-06 14:47:36
269
转载 类型转换
隐式转换(implicit conversion)short a=2000;int b;b=a;short是两字节,int是四字节,由short型转成int型是宽化转换(bit位数增多),编译器没有warning,如下图所示。宽化转换(如char到int,int到long long,int到float,float到double,int到double等)构成隐式转换,
2014-09-06 13:18:33
267
转载 main函数之前之后做了哪些工作
一、 main结束 不代表整个进程结束 (1)全局对象的构造函数会在main 函数之前执行, 全局对象的析构函数会在main函数之后执行; 用atexit注册的函数也会在main之后执行.(2)一些全局变量、对象和静态变量、对象的空间分配和赋初值就是在执行main函数之前,而main函数执行完后,还要去执行一些诸如释放空间、释放资源使
2014-09-06 11:22:40
505
转载 strcpy和memcpy区别
strcpy和memcpy都是标准C库函数,它们有下面的特点。strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。
2014-09-03 21:16:23
203
转载 define和typedef
typedef是一种在计算机编程语言中用来声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的的类型定义关键字。 #define是预处理指令。下面让我们一起来看。typedef是C语言语句,其功能是用户为已有数据类型取“别名”。 例如: typedef int INTEGER; 这以后就可用INTEGER来代替int作整型变量的类型说明了,如:
2014-09-03 20:13:59
372
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人