- 博客(48)
- 资源 (4)
- 收藏
- 关注
原创 内存分配方法与策略
在C语言中,内存被分成5个区,它们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。堆:是那些由new分配的内存块,它们的释放编译器不用管,由应用程序去控制,一般一个new就要对应一个delete。加入此程序员没有释放掉,那么程序结束后,操作系统会自动回收。栈:是那些由编译器在需要的时候分配,在无须的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。自由存储区:是
2014-09-22 20:18:28
1598
转载 TCP与UDP的区别
TCP与UDP区别TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不
2014-09-17 21:18:11
1740
原创 网络中常见的ping命令协议
ICMP是“Internet Control Message Ptotocol”(Internet控制消息协议)的缩写。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。在网络中经常会使用到ICMP协议。例如经常用于检查网络不通的
2014-09-17 12:51:55
17401
翻译 剑指offer面试题(一):赋值运算符函数
对于定义一个赋值运算符函数时,需要注意一下几点:(1)函数的返回类型必须是一个引用,因为只有返回引用,才可以连续赋值(2)传入的参数声明为常量引用,可以提高代码效率,同时赋值运算函数内不会改变传入的实例状态(3)一定要记得释放实例自身已有的内存,否则程序容易出现内存泄露(4)注意传入的参数和当前的实例是不是同一个实例,如果是同一个,则不用进行赋值操作,直接返回即可。代码示例如下
2014-09-15 11:41:04
4382
原创 2015腾讯校园招聘软件测试部分笔试题
1、计算机系统中CPU中的base寄存器和limit寄存器的作用是()2、操作系统不执行以下哪个操作()A 分配内存 B 输出/输入 C 资源回收 D 用户访问数据库资源3、以下哪个是用于用户拨号认证的()A PPTP B IPSec C L2P D CHAP4、下列哪一项用于产生数字签名()A 接收方的私钥B 发送方的私钥C 发送方的公钥D 接收方
2014-09-13 18:42:38
16422
原创 白盒测试
白盒测试是指基于一个应用代码的内部逻辑知识,即覆盖全部代码、分支、路径、条件,使用程序设计的控制结构导出测试用例。白盒测试的主要方法有逻辑驱动、基路测试等,主要用于软件验证。白盒测试方法必须遵循以下4条原则:(1)保证一个模块中的所有独立路径至少被测试一次;(2)所有逻辑值均需要测试真和假两种情况;(3)检查程序的内部数据结构,保证其结构的有效性;(4)在上、下边界及可操作
2014-09-10 15:22:56
12980
原创 避免在析构函数中编写代码
上篇文章中,我们介绍了为什么应该彻底避免编写拷贝构造函数和赋值操作符。今天这篇我们讨论下为什么应该避免在析构函数中编写代码。即让析构函数为空。例如:virtual ~MyClass(){}我们用空析构函数这个术语表示花括号内没有代码的析构函数。需要编写析构函数可能有如下几个原因:在基类中,可能需要声明虚拟析构函数,这样就可以使用一个指向基类的指针指向一个派生类的实例
2014-07-21 11:55:57
2477
原创 未初始化的布尔值(二)
在C++中所特有的另一种内置类型bool。它只是一种特殊情况,因为对于布尔值,我们并不需要像++这样的操作符。反之,我们需要特定的布尔操作符,例如&=和|=,因此,这个类型是单独定义的:class Bool{public: Bool(bool x=false) : data_(x) { } operator bool () const { return data_; }
2014-07-20 10:43:18
2696
原创 拷贝构造函数和赋值操作符
假设有一个如下的MyClass类:class MyClass{public: //构造函数 //拷贝构造函数 MyClass(const MyClass& that) : int_data_(that.int_data_), dbl_data_(that.dbl_data_), str_data_(that.str_data_) { } //赋值操作符 M
2014-07-19 19:29:34
1864
原创 解引用NULL指针
一般导致程序崩溃的最重要原因之一就是试图解引用NULL指针。正如上几篇文章中所说的,智能指针RefCountPtr和ScopedPtr提供了运行时的诊断。但是,并不是所有的指针都是拥有某个对象所有的智能指针。因此为了对试图解引用一个不具有对象所有权的指针的行为进行诊断,引入一种并不删除它所指向的对象的“半智能”指针。例如,如下代码示例:template class Ptr{ public
2014-07-18 11:21:44
8631
原创 用智能指针实行所有权
现在我们讨论下使用返回指针的函数的潜在错误。假设有一个函数返回一个指向某个MyClass类型的对象的指针。MyClass* MyFactoryClass::Create(const Inputs& inputs);这个函数的一个非常显而易见的问题是,它的调用者是否负责删除这个对象?或者说这个指针所指向的MyClass类的实例是MyFactoryClass所拥有的实例?这个问题显然应该在声明
2014-07-16 08:28:30
1814
1
原创 作用域指针(三)
作用域指针当我们并不打算复制智能指针,只是想保证被分配的资源将被正确地回收,可以采用一种简单得多的解决方案:作用域指针。如下示例代码:template class ScopedPtr{public: explicit ScopedPtr(T* p = NULL) :ptr_(p) { } ScopedPtr& operator=(T* p) { if(ptr_ !
2014-07-15 11:47:32
1861
原创 引用计数指针(二)
如前面内存泄露中所讲的,引用计数指针可以被复制。因此,一个智能指针的几份拷贝可以指向同一个对象。这就产生了由哪份拷贝负责删除它们共同指向的对象这个问题。答案是这组智能指针中最后消亡的那个将删除它所指向的对象。这类似于家居规则:“最后一个离开屋子的人负责关灯。”为了实现这个算法,这些指针共享一个计数器,记录有多少个智能指针引用同一个对象,即“引用计数”这个术语的由来。引用计数的应用范围很广:这个术语
2014-07-14 17:07:55
1639
原创 初始化的数值(int、double等)(一)
首先考虑一个具有几个构造函数的MyClass类。假设我们决定在这个类的私有部分添加一个新的数据成员,称为int_data_:class MyClass{public: MyClass() : int_data_(0) {} explicit MyClass(const Apple& apple) : int_data_(0) {} MyClass(const stri
2014-07-12 21:10:47
6881
原创 无效的指针、引用和迭代器
首先以示例代码为例:vector v;//添加一些元素fir(int i=0; i<10; ++i) v.push_back(i);int* my_favorite_element_ptr = &v[3];cout<<"My favorite element = "<<(*my_favorite_element_ptr)<<endl;cout<<"Its address = "
2014-07-11 17:40:55
1679
原创 动态数组索引越界问题
1、在C++中,可以采用几种不同的方法创建一个某种类型T的对象的数组。3种常用的方法如下:#define N 10 //数组的长度N在编译时已知 T static_array[10]; int n = 20; //数组的长度n是在运行时计算的 T* dynamic_array = new T[n]; std::vector vector_array; //数组的长度可以在运
2014-07-10 21:11:14
3051
原创 多维数组的索引越界问题
1、我们大都知道可以使用vector或array模板作为线性数组的实现,那么对于需要二维矩阵、三维数组(或者N维数组)时应该怎么解决。由于N维数组的基本情况中的所有问题都可以用一个二维矩阵举例说明,因此以下的讨论仅限于此,并简单的称为矩阵。如果矩阵的大小在编译时是已知的,可以很方便的把它实现为数组的数组,这个很简单。这里,我们主要把注意力集中在当矩阵的大小是在运行时计算产生,对于这种复杂的
2014-07-09 09:03:46
2285
原创 静态数组的索引越界问题
1、静态数组处理静态数组:#define N 10 //数组的长度N在编译时已知 T static_array[N];这里,数组的长度在编译时是已知的并且不会改变。当然,为了使用具有边界检查的安全数组,也可以vector模板,并在一个构造函数中指定它的长度:scpp::vector vect(N);它的效果与静态数组完全相同,但问题在于效率。静态数组是在堆栈上分配内存,而vec
2014-07-08 22:28:41
2159
原创 C语言中的边界计算与不对称边界(二)
尽管C语言的数组会让新手感到麻烦,然而C语言中数组的这种特别的设计正是其最大优势所在。要理解这一点,以下是一些简单解释。 在所有常见的程序设计错误中,最难于察觉的一类是“栏杆错误”,也常被称为“差一错误”(off-by-one error)。例如这个问题:100英尺长的围栏每隔10英尺需要一根支撑用的栏杆,一共需要多少根栏杆呢?如果不加思索,大家会容易以为是100除以10,即为10
2014-07-06 19:03:02
2495
原创 shell简介
1、shell的工作原理 其实当一个用户以命令行方式登录Linux系统之后,即就进入了shell应用程序。例如:以dog用户使用telnet登录Linux系统之后,就会进入shell的控制。从此时起shell就随时恭候,等待你的差遣(即等你输入命令)并为你保质保量的提供服务(执行输入的命令)。如果你是以图形界面登录,当开启一个终端窗口后也将进入shell应用程序的控制。跟开启的do
2014-06-24 11:24:33
997
原创 C语言中的声明与定义的区别
1、对于下面的声明语句int a; 如果其位置出现在所有的函数体之外,那么它就被称为外部对象a的定义。这个语句说明了a是一个外部整型变量,同时为a分配了存储空间。因为外部对象a并没有被明确指定任何初始值,所以它的初始值默认为0(某些系统中的连接器对以其他语言编写的程序并不保证这一点,C编译器有责任以适当方式通知连接器,确保未指定初始值的外部变量初始化为0)。2、又如下面的声明语
2014-06-23 08:54:55
4492
原创 C语言中连接器介绍
在C语言中,一个重要的思想就是分别编译,即若干个源程序可以在不同的时候单独进行编译,然后在恰当的时候整合到一起。但是连接器一般是与C编译器分离的,连接器如何做到把若干个C源程序合并成一个整体呢?
2014-06-22 11:14:45
6745
原创 Linux系统中目录详解
1、Linux文件系统的层次结构 在Linux或Unix操作系统中,所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构。 文件系统的最顶层是由根目录开始的,系统使用”/“来表示根目录。在根目录之下的既可以是目录,也可以是文件,而每一个目录中又可以包含子目录文件。如此反复就可以构成一个庞大的文件系统。 在Linux文件系统中有两个特殊的目录,一
2014-06-10 15:51:18
3605
转载 面向用户需求的产品设计
Playpump 支持基金会 The Case Foundation CEO Jean Case人员说,创新的本质就是短短的chua
2014-05-22 17:28:06
3481
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人