c++
唯pc远方
这个作者很懒,什么都没留下…
展开
-
C++面试常见题目问与答(汇总一)
[置顶] C++面试常见题目问与答(汇总一)此次整理来自QQ群186588041,所有资料来自谭校长、张教主、H神、Robort、fight for dream、刀刀、二货 主要是总结了一些经常被问道的面试题 经验不足,水平有限,希望读者能提出宝贵的意见~~~~1、什么是虚函数?什么是纯虚函数?答:虚函数声明如下: virtual ReturnT转载 2015-10-26 12:13:17 · 1004 阅读 · 0 评论 -
内联函数,构造函数,静态函数都不能是虚函数
inline, static, constructor三种函数都不能带有virtual关键字。inline是编译时展开,必须有实体;static属于class自己的,也必须有实体;virtual函数基于vtable(内存空间),constructor函数如果是virtual的,调用时也需要根据vtable寻找,但是constructor是virtual的情况下是找不到的,因为const转载 2015-08-07 23:26:52 · 562 阅读 · 0 评论 -
C++中智能指针的设计和使用
转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7561235 智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向转载 2015-09-04 12:03:32 · 313 阅读 · 0 评论 -
char str[] 和 char *str 的区别
[cpp] view plaincopychar* get_str(void) { char str[] = {"abcd"}; return str; } char str[] = {"abcd"};定义了一个局部字符数组,尽管是数组,但它是一个局部变量,返回它的地址肯定是一个已经释放了的空间的地址。转载 2015-09-04 12:07:02 · 348 阅读 · 0 评论 -
char* 和char[]的区别
以下内容均来自互联网,系笔者汇总并总结。1. 问题介绍问题引入:在实习过程中发现了一个以前一直默认的错误,同样char *c = "abc"和char c[]="abc",前者改变其内容程序是会崩溃的,而后者完全正确。程序演示:测试环境Devc++代码#include using namespace std;main(){转载 2015-09-04 11:59:21 · 319 阅读 · 0 评论 -
C++ Primer 学习笔记_98_特殊工具与技术 --优化内存分配
特殊工具与技术--优化内存分配引言:C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象。new表达式自动运行合适的构造函数来初始化每个动态分配的类类型对象。new基于每个对象分配内存的事实可能会对某些类强加不可接受的运行时开销,这样的类可能需要使用用户级的类类型对象分配能够更快一些。这样的类使用的通转载 2015-09-03 18:39:58 · 397 阅读 · 0 评论 -
STL中各个容器的底层数据结构
C++ STL 的实现:1.vector 底层数据结构为数组 ,支持快速随机访问2.list 底层数据结构为双向链表,支持快速增删3.deque 底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问4.stack 底层一般用23实现,封闭头部即可,不用vector的原因应该是容量大小有限转载 2015-09-03 21:33:51 · 1882 阅读 · 0 评论 -
vector内存释放机制
vector 中的内建有内存管理,当 vector 离开它的生存期的时候,它的析构函数会把 vector 中的元素销毁,并释放它们所占用的空间,所以用 vector 一般不用显式释放 —— 不过,如果你 vector 中存放的是指针,那么当 vector 销毁时,那些指针指向的对象不会被销毁,那些内存不会被释放。 vector的工作原理是转载 2015-09-03 20:40:24 · 5487 阅读 · 0 评论 -
STL vector, deque, list对比
内存使用对比(分析基于MS stl)1. deque和vector的pop都不会释放内存,list的pop会释放内存2. 但是当数量比较大的时候,deque的析构函数非常慢,vector的很快,list更慢3. vector占用内存最小,deque其次,list最大 以vector为基准,deque和list多有一些功能方法dequepop_frontpush_fr转载 2015-09-03 17:40:38 · 646 阅读 · 0 评论 -
深入理解vector list deque——存储结构机理
先来看一下 c++标准模板库中,容器类vector、list 、deque都属于顺行性容器(所谓顺序性容器是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集,每个元素都有固定的位置,这个位置与元素无关,只与插入删除的先后顺序有关);都可以用来存储一组类型相同的对象;不同于内置数据类型数组的是,vector、list、deque的大小不是固定的,他们支持动态增长。 之所以转载 2015-09-03 19:44:27 · 398 阅读 · 0 评论 -
C++ Primer 学习笔记_99_特殊工具与技术 --优化内存分配[续1]
特殊工具与技术--优化内存分配[续1]三、operator new函数和operator delete 函数– 分配但不初始化内存首先,需要对new和delete表达式怎样工作有更多的理解。当使用new表达式[cpp] view plaincopystring *sp = n转载 2015-09-03 18:38:53 · 411 阅读 · 0 评论 -
c++面试总结
电话问题1:构造和析构函数中的虚函数调用;答案:虚函数可以在构造函数和析构函数中调用,但虚函数此时是静态绑定;而非动态绑定。电话问题2:C++中的异常可不可以是引用;答案:异常可以是引用,并且效率高。电话问题3:TCP状态中的close_wait是什么状态;答案:close_wait状态是被动关闭方的一个状态,此时是半关闭状态,被关闭转载 2015-08-16 09:00:31 · 333 阅读 · 0 评论 -
ptmalloc,tcmalloc和jemalloc内存分配策略研究
最近看了glibc的ptmaoolc,Goolge的tcmalloc和jemalloc,顺便做了一点记录。可能有些地方理解地不太对,如有发现还请大神指出。 操作系统内存布局 各种malloc的内存分配管理方式离不开操作系统的内存布局策略。32位经典内存布局 32位系统下经典内存布局如上,程序起始的1GB地址为内核空间,接下来是向下增长的栈空间和由0×400000转载 2015-08-29 22:41:45 · 630 阅读 · 0 评论 -
C/C++编译和链接过程详解 (重定向表,导出符号表,未解决符号表)
详解link 有 些人写C/C++(以下假定为C++)程序,对unresolved external link或者duplicated external simbol的错误信息不知所措(因为这样的错误信息不能定位到某一行)。或者对语言的一些部分不知道为什么要(或者不要)这样那样设计。了解本文之后, 或许会有一些答案。 首先看看我们是如何写一个程序的。如果你在使用某种IDE(Visu转载 2015-08-29 16:15:23 · 522 阅读 · 0 评论 -
结构型模式总结
结构型设计模式是从程序的结构上解决模块之间的耦合问题(好像是句废话),GoF23种设计模式中结构型设计模式有7种,分别是:Adapter适配器模式、Bridge桥接模式、Composite组合模式、Decorator装饰模式、Facade外观模式、Flyweight享元模式和Proxy代理模式。下面分别总结一下这几种模式:设计模式GoF的描述我的理解转载 2015-08-29 21:17:33 · 361 阅读 · 0 评论 -
C/C++ 中的0长数组(柔性数组)
在标准C和C++中0长数组如charArray[0]是不允许使用的,因为这从语义逻辑上看,是完全没有意义的。但是,GUN中却允许使用,而且,很多时候,应用在了变长结构体中,如:StructPacket{Int state;Int len;Char cData[0]; //这里的0长结构体就为变长结构体提供了非常好的支持}; 首先对0长数组做一个解释:转载 2015-08-29 16:11:55 · 336 阅读 · 0 评论 -
找工作C++面试资料之问答题整理(1)
1.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?答:首先,extern是C/C++语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。extern "C"是连接申明(linkage declaration),被转载 2015-08-29 15:50:35 · 394 阅读 · 0 评论 -
函数指针和函数对象
函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址。函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数。函数指针的声明方法:数据类型标志符 (指针变量名) (形参列表);一般函数的声明为: int func ( int x );而一个函数指针的声明方法为:int (*func) (int转载 2015-08-13 10:34:07 · 265 阅读 · 0 评论 -
STL hash_map 底层初探
hash_map 底层是采用hashtable实现的,在讲解hash_map之前,先看一下hash_table的原理。(1)hashtable数据结构hash table表格内的元素称为桶(bucket),而由桶所链接的元素称为节点(node),其中存入桶元素的容器为stl本身很重要的一种序列式容器——vector容器。之所以选择vector为存放桶元素的基础容器,主要是因为vector容转载 2015-09-05 10:12:33 · 351 阅读 · 0 评论 -
面向对象的三个基本元素,五个基本原则
三个基本元素:1. 封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。2. 继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性转载 2015-09-05 00:44:25 · 392 阅读 · 0 评论 -
代码变成可执行程序期间,编译器做了那些事?
代码变成可执行程序期间,编译器做了那些事?1. 怎么就在编译时确定了 sizeof 的大小了?2.编译时确定的东西?3.运行时确定的东西? C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、转载 2015-09-20 11:10:47 · 1963 阅读 · 0 评论 -
函数的可重入性理解
函数的可重入性理解 最近,项目要求可能需要做博通的交换芯片的驱动程序,涉及到多用户同时进行操作,和大量的数据处理,因此在进行代码架构的时候需要进行前期简单的验证设计。考虑到一点就是程序设计的可重入性。经过简单的搜索,在维基百科和其他朋友的帖子里找到了相关概念。为了帮助自己今后理解,特地将此概念加上自己的理解整理在此。一、维基百科解释 1 若一个程序转载 2015-09-19 15:53:13 · 1923 阅读 · 0 评论 -
AVL树,红黑树,B树,B+树,Trie树应用场景简介
AVL树,红黑树,B树,B+树,Trie树应用场景简介 AVL树:平衡二叉树,一般是用平衡因子差值决定并通过旋转来实现,左右子树树高差不超过1,那么和红黑树比较它是严格的平衡二叉树,平衡条件非常严格(树高差只有1),只要插入或删除不满足上面的条件就要通过旋转来保持平衡。由于旋转是非常耗费时间的。我们可以推出AVL树适合用于插入删除次数比较少,但查找多的情况。转载 2015-09-19 21:14:33 · 4935 阅读 · 0 评论 -
BT、电骡、迅雷等P2P下载原理
BT、电骡、迅雷等P2P下载原理 迅雷的下载原理:一、迅雷下载原理分析 迅雷的工作原理据称为”多资源超线程技术基于网格原理,能够将网络上存在的服务器和计算机资源进行有效的整合”。实际上还是传统的下载技术,只不过这种下载技术综合应用HTTP、FTP传输协议将文件的文件进行分块、分片下载;而且还可以将文件等分,然后去不同地址下转载 2015-09-19 20:14:34 · 1257 阅读 · 1 评论 -
C++对象模型系列集合
C++对象模型系列集合文章: 指针和引用 指针与数组 指针与字符串 堆栈与函数调用 sizeof与对象内存布局 单继承与虚函数表 多重继承与虚函数表 虚继承与虚函数表 类型转化参考:1) C++对象模型 C++对象模型笔记:http://blog.csdn.net/ZengMuAnSha/archive/200转载 2015-09-19 08:49:18 · 565 阅读 · 0 评论 -
再论C++之垃圾回收(GC)
再论C++之垃圾回收(GC)使用智能指针(smart pointers)http://www.codeproject.com/cpp/garbage_collect.asp原理:基于引用计数(reference count)。这种垃圾回收(gc)算法无非都是给每一块分配的内存提供引用计数,然后通过智能指针(smart pointer)自动完成引用计数的加转载 2015-09-19 15:34:45 · 1752 阅读 · 0 评论 -
Linux开发中常见段错误问题原因分析
Linux开发中常见段错误问题原因分析1 使用非法的内存地址(指针),包括使用未经初始化及已经释放的指针、不存在的地址、受系统保护的地址,只读的地址等,这一类也是最常见和最好解决的段错误问题,使用GDB print一下即可知道原因。 2 内存读/写越界。包括数组访问越界,或在使用一些写内存的函数时,长度指定不正确或者这些函数本身不能指定长度,典型的函数有strcpy(strncpy转载 2015-09-18 22:12:35 · 1577 阅读 · 0 评论 -
可能发送内存段错误的情况
在此罗列一些可能导致段错误的地方,以及如何避免相应的错误 出现段错误时,有的很容易调查,但有的很难调查,比如在一个地方把内存写错,需要过一段时间另一个地方读这个内存时,才出错。这种是非常难定位的。因此在编写代码时一定要小心预防。 1 使用非法的指针,包括使用未经初始化及已经释放的指针(指针使用之前和释放之后置为NULL) 2转载 2015-09-18 22:05:18 · 821 阅读 · 0 评论 -
内存泄漏以及常见的解决方法
内存泄漏以及常见的解决方法 之所以撰写这篇文章是因为前段时间花费了很大的精力在已经成熟的代码上再去处理memory leak问题。写此的目的是希望我们应该养成良好的编码习惯,尽可能的避免这样的问题,因为当你对着一大片的代码再去处理此类的问题,此时无疑增加了解决的成本和难度。准确的说属于补救措施了。1. 什么是内存泄漏(memory leak)? 指由于疏忽转载 2015-09-19 15:36:24 · 329 阅读 · 0 评论 -
map容器对象插入数据的4种方式讲解
map容器对象插入数据的4种方式讲解map容器对象插入数据的4种方式#include #include #include #include using namespace std;int main(){ mapint, string> Employee; //通过键值赋值 Employee[123] = "Ma转载 2015-09-13 19:46:31 · 1874 阅读 · 0 评论 -
map的详细用法
map的详细用法[cpp] view plaincopymap的详细用法: map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这转载 2015-09-13 19:48:39 · 344 阅读 · 0 评论 -
c和c++中NULL和0的区别
1,什么是空指针常量(null pointer constant)?[6.3.2.3-3] An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.这里告诉我们:0、0L、'\0'、3 -转载 2015-09-06 22:33:22 · 425 阅读 · 0 评论 -
联合体相关
1、联合(union)是一种特殊的类。一个union对象可以有多个数据成员,但是任何时刻,只有一个成员可以有值。当将一个值赋给union对象的一个成员的时候,其他所有成员都变为未定义的。每个 union 对象的大小在编译时是固定的:至少与最大数据成员的一样大。2、union不能作为基类使用,所以成员函数不能为虚函数。union不能具有静态数据成员或引用成员,而且,union不能具有定义了构转载 2015-09-25 23:53:24 · 438 阅读 · 0 评论 -
关于模版的实参推演
templatevoid fun1(T a){T x,y;coutcout}templatevoid fun2(T *a){//T x,y;//T x=0,y=0;coutcout}templatevoid fun3(const T *a){ T x,y;coutcout}void main()原创 2015-08-21 17:10:53 · 816 阅读 · 0 评论 -
单例模式及C++实现代码
单例模式单例模式,可以说设计模式中最常应用的一种模式了,据说也是面试官最喜欢的题目。但是如果没有学过设计模式的人,可能不会想到要去应用单例模式,面对单例模式适用的情况,可能会优先考虑使用全局或者静态变量的方式,这样比较简单,也是没学过设计模式的人所能想到的最简单的方式了。一般情况下,我们建立的一些类是属于工具性质的,基本不用存储太多的跟自身有关的数据,在这种情况下,每次都去new一个对象,转载 2015-09-25 08:59:28 · 390 阅读 · 0 评论 -
C++_运算符重载
什么是运算符的重载? 运算符与类结合,产生新的含义。 为什么要引入运算符重载? 作用:为了实现类的多态性(多态是指一个函数名有多种含义)怎么实现运算符的重载?方式:类的成员函数 或 友元函数(类外的普通函数)规则:不能重载的运算符有 . 和 .* 和 ?: 和 :: 和 sizeof友元函数和成员函数的使用场合:一般情况下,建议一元运转载 2015-09-05 22:10:14 · 331 阅读 · 0 评论 -
stl内存池学习
最近开始学习内存池技术,《高质量c++/c编程指南》在内存管理的第一句话就是:欢迎进入内存这片雷区,由此可见掌握内存管理对于c++/c程序员的重要性。使用内存池的优点有:降低动态申请内存的次数,提升系统性能,减少内存碎片,增加内存空间使用率。 内存池的分类: 一、不定长内存池:优点:不需要为不同的数据创建不同的内存池,缺点是分配出去的内存池不能回收到池中(?)。代表有a转载 2015-09-04 16:47:06 · 1281 阅读 · 0 评论 -
学习STL map, STL set之数据结构基础
STL map和set的使用虽不复杂,但也有一些不易理解的地方,如: 或许有得人能回答出来大概原因,但要彻底明白,还需要了解STL的底层数据结构。C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map转载 2015-08-27 22:29:52 · 288 阅读 · 0 评论 -
关于const的底层实现
1. 对于直接已知值的int,long,short,char 类型以及其unsigned版本,即 const int a=2; 这种,编译器编译程序之后,程序中所有a出现的地方,全部自动替换成2. 所以,就出现了对于 *b=3 ,在 const int a=2 ;中不会修改a,而在 const int a=c; 中则会修改 a的情况.int main(){const int a = 1原创 2015-08-26 19:20:20 · 1703 阅读 · 1 评论 -
设计一个不能被继承的类
设计一个不能被继承的类分类: cpp2012-02-19 20:33 1390人阅读 评论(0) 收藏 举报destructorconstructorfunctionclass编译器c在c++中每个类都一个构造函数和一个析构函数,即使用户不明确定义,系统也会类定义一个默认的构造函数和析构函数。当创建该类的对象可以显示或者隐式调用构造函数,当对象销毁时会自动调用析构函转载 2015-05-20 23:53:12 · 435 阅读 · 0 评论