C/C++
文章平均质量分 71
hustyangju
这个作者很懒,什么都没留下…
展开
-
C++中智能指针的设计和使用
原文地址:http://blog.csdn.net/hackbuteer1/article/details/7561235 智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计转载 2015-09-12 17:00:03 · 866 阅读 · 0 评论 -
windows和Linux内存的对齐方式
一.内存对齐的初步讲解内存对齐可以用一句话来概括:“数据项只能存储在地址是数据项大小的整数倍的内存位置上”例如int类型占用4个字节,地址只能在0,4,8等位置上。例1:#include struct xx{ char b; int a; int c; char d;};int main()原创 2014-10-29 19:51:04 · 1912 阅读 · 0 评论 -
LINUX下GDB反汇编和调试
Linux下的汇编与Windows汇编最大的不同就是第一个操作数是原操作数,第二个是目的操作数,而Windows下却是相反。1、 基本操作指令简单的操作数类型说明,一般有三种,(1)立即数操作数,也就是常数值。立即数的书写方式是“$”后面跟一个整数,比如$0x1F,这个会在后面的具体分析中见到很多。(2)寄存器操作数,它表示某个寄存器的内容,用符号Ea来表示任意寄存器a,用原创 2014-06-05 14:38:20 · 2552 阅读 · 0 评论 -
浮点数的二进制表示
基础知识:十进制转十六进制;十六进制转二进制;IEEE制定的浮点数表示规则;了解:目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格: 符号位原创 2014-06-05 10:32:30 · 1813 阅读 · 0 评论 -
空指针的深入理解(C/C++)
空指针究竟指向了内存的哪个地方?如果仅仅声明一个指针,而没有任何赋值,那么这个指针是野指针,它会指到VM的任何位置,碰到异常操作,比如对只读区写操作,就会引起硬件中断产生core,也就是通常的段错误。良好的编程风格是将指针永远都可控,也就是这个指针的地址,程序可控,通常,对于不使用或初始的指针都将其地址置为0,这是约定俗成的,就如同,我们经常使用的进制一样,你非用一个别人都不用的进原创 2014-05-13 10:31:23 · 5083 阅读 · 0 评论 -
指向指针的指针
理解二级指针,关键是理解指针的存储方式和意义。这里以指向int型指针的指针为例,梳理一下二级指针在内存分配中 的奥妙....#include using namespace std;int main(){ int a[5] = {1, 2, 3, 4, 5}; int *p = a; int **point = &p; cout << "a = "原创 2014-05-12 15:12:36 · 900 阅读 · 0 评论 -
STL 之 vector 源码剖析
这里不讨论vector的使用,毕竟参透源码,怎么用也就更清晰了。参考侯捷的源码分析,根据理解的深入会加入一些注解!G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_vector.h 完整列表/* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use,原创 2014-04-25 11:24:26 · 1177 阅读 · 0 评论 -
C++之作用域运算符::
C++使用::运算符搞定很多东西,其中最基本的一个用处就是用来决议多继承中的重名成员。::运算符的本质是:左操作数是一个scope,右操作数是这个scope内的名字,可以是 scope,class,member或者function,variable等等,从左操作数指定的scope中找到有操作数这个实体。看起来非常优雅,不是么?可是,它有好几个缺陷。一、现实的常见的缺陷。分散在代码中,一旦改变会引起原创 2014-04-11 10:32:18 · 4909 阅读 · 1 评论 -
二叉树性质盘点
==========================================================================================基础部分原创 2014-05-16 13:11:48 · 883 阅读 · 0 评论 -
C++的沉迷与爱恋 from 侯捷
最近读了不少侯捷的书,站在巨人的肩膀上力不能及,只希望追逐之旅有所受益!C++的沉迷与爱恋 作者:侯捷 1998.09.28 发表 每年的 09/28 於我都是一个特殊的日子 -- 不只是因为教师节。今年很特殊地没有普天同庆,那麽我就写篇文章自己庆祝一下好了。 我於今年七月发表了一本着作 和一本译作 ,获得很大的回响。这些作品都不是针对 C原创 2014-04-24 11:18:04 · 1503 阅读 · 0 评论 -
C++中智能指针的原理和简单使用
参考:(1)http://blog.csdn.net/hackbuteer1/article/details/7561235(2)c++ primer P421-425智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指原创 2014-04-16 10:40:57 · 1196 阅读 · 0 评论 -
C++异常安全之std:auto_ptr
auto_ptr是C++标准库中()为了解决资源泄漏的问题提供的一个智能指针类模板(注意:这只是一种简单的智能指针)auto_ptr的实现原理其实就是RAII,在构造的时候获取资源,在析构的时候释放资源,并进行相关指针操作的重载,使用起来就像普通的指针。std::auto_ptr pa(new ClassA);很多人听说过标准auto_ptr智能指针机制,但并不是每个人都天天使用它。这原创 2014-04-22 11:35:56 · 1638 阅读 · 0 评论 -
C/C++随机数生成方法
一、随机数测试C++中常用rand()函数生成随机数,但严格意义上来讲生成的只是伪随机数(pseudo-random integral number)。生成随机数时需要我们指定一个种子,如果在程序内循环,那么下一次生成随机数时调用上一次的结果作为种子。但如果分两次执行程序,那么由于种子相同,生成的“随机数”也是相同的。在工程应用时,我们一般将系统当前时间(Unix时间)作为种子,这原创 2014-11-21 15:01:10 · 1343 阅读 · 0 评论 -
effective c++条款13-17 “以对象管理资源”之C++类型转换函数和构造函数
其实我们已经在C/C++中见到过多次标准类型数据间的转换方式了,这种形式用于在程序中将一种指定的数据转换成另一指定的类型,也即是强制转换,比如:int a = int(1.23),其作用是将1.23转换为整形1。然而对于用户自定义的类类型,编译系统并不知道如何进行转换,所以需要定义专门的函数来告诉编译系统改如何转换,这就是转换构造函数和类型转换函数! 一、转换构造函数原创 2014-12-02 10:47:57 · 841 阅读 · 0 评论 -
linux中fork()函数详解(原创!!实例讲解)
一、fork入门知识 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进转载 2015-09-06 16:44:48 · 573 阅读 · 0 评论 -
mem系列函数(memset memcpy memmove) 和str系列函数(strlen strcpy strcmp strcat strstr strtok)
void *memset(void *s, int ch, size_t n); 函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。 memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法 最常见的错误:memset是按字节填充的,对其他多余一个字节的类型填充要注意原创 2015-09-12 11:22:57 · 2435 阅读 · 0 评论 -
从编译器角度分析C语言中数组名和指针的区别
数组名和指针是两个往往很容易让人们混淆的概念,很多人以为数组名就是一个指针,也有很多人知道数组名不同于指针但是仅知道数组名的值不能像指针一样改变例如你可以写出下面这样的代码:int *p;p++;却不能写这样的代码:int a[];a++;那么数组名跟指针之间到底有什么区别呢?第一,在声明上,只原创 2015-08-25 10:15:30 · 1003 阅读 · 0 评论 -
boost库 bind/function的使用
1 bind/function 引 (1)头文件 bind函数#include转载 2015-07-07 15:03:50 · 422 阅读 · 0 评论 -
g++ GNU g++常用编译选项用法
http://blog.csdn.net/mtawaken/article/details/7416332http://blog.csdn.net/poechant/article/details/6641783http://www.cnblogs.com/cryinstall/archive/2011/09/27/2280824.html转载 2015-07-07 18:58:05 · 439 阅读 · 0 评论 -
一些常常被问到的问题小结
1、进程切换的过程是怎样的?什么是用户态,核心态?什么时候发生进程切换?2、如何编写一个线程安全的HashMap?3、java集合中ArrayList,LinkList,Vector的区别?4、c语言中的malloc和c++中的new有何区别?5、c语言中的静态库和动态链接库的区别?6、网络中的大端和小端的区别?7、Hash算法中解决"冲突"的办转载 2015-04-13 20:37:54 · 507 阅读 · 0 评论 -
linux中memset的正确用法
【起因】希望对各种类型的数组进行初始化,避免野值 【函数头文件】 提示:在linux中可以在terminal中输入 "man memset"进行查询 #include void *memset(void *s, int c, size_t n); 【使用说明】 The memset() function fills the转载 2015-04-13 20:04:30 · 7778 阅读 · 0 评论 -
C++中如何计算程序运行的时间
一个程序的功能通常有很多种方法来实现,怎么样的程序才算得上最优呢?举个例子,如果实现同一个功能的两个程序,一个一点按钮就给出运行结果,而另一个则需要漫长的时间去等待,就像安装WINDOWS XP一样(呵呵,太夸张了吧),你会去使用哪个程序呢?毋庸置疑,最优程序的第一条法则就是:程序的运行速度要快。 那么,既然一个程序能用多种方法来实现,我又如何知道哪种方法是最优的呢?有些程序是显而易见的转载 2015-03-18 18:34:40 · 676 阅读 · 0 评论 -
高效实现 std::string split() API
Qt下 QString 实现了split()函数,而std::string则没有实现,STL中也没有实现,只能自己写一个了。#include #include using namespace std; vector split(string strtem,char a) { vector strvec; string::size_type po原创 2015-03-20 14:07:52 · 10182 阅读 · 1 评论 -
参数返回值及NRV优化(named return value optimization)
C++11中的移动构造函数又把NRV优化翻出来了,都是采用临时中间值优化,两者不能共存。参数传递如何实现?【实现模型1】引入临时对象,使用拷贝构造函数初始化。然后利用bitwise copy将其拷贝到x0的位置。比如:void foo( X x0 );X xx;foo( xx );改写成X __temp0;__temp0.X::X ( xx );foo( __t原创 2014-12-15 10:05:13 · 1217 阅读 · 0 评论 -
如何使用随机数函数
srand函数是随机数发生器的初始化函数,原型: void srand(unsigned seed); 它需要提供一个种子,如: srand(1); 直接使用1来初始化种子。 不过常常使用系统时间来初始化,即使用 time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数,然后将time_t型数原创 2014-11-24 03:24:16 · 1582 阅读 · 0 评论 -
c++ struct与class的区别
从语法上,在C++中(只讨论C++中)。class和struct做类型定义时只有两点区别: (一)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理; (二)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。 除了这两点,class和struct基原创 2014-04-23 10:36:06 · 8644 阅读 · 1 评论 -
dynamic_cast详解
1 用法介绍 参考:http://baike.baidu.com/link?url=lwqlXGEAznkWAc26v929RfiiTY67x6OwVrm-VMpx99LElkrqiTyd1FlLISPVcht3BfmoW4TqxgJi10gl0PJSe_dynamic_cast ( expression)该运算符把expression转换成type-id类型的对象。Type-i原创 2014-04-22 16:27:52 · 2055 阅读 · 0 评论 -
C++异常处理
程序中的错误分为编译时的错误和运行时的错误。编译时的错误主要是语法错误,比如:句尾没有加分号,括号不匹配,关键字错误等,这类错误比较容易修改,因为编译系统会指出错误在第几行,什么错误。而运行时的错误则不容易修改,因为其中的错误是不可预料的,或者可以预料但无法避免的,比如内存空间不够,或者在调用函数时,出现数组越界等错误。如果对于这些错误没有采取有效的防范措施,那么往往会得不到正确的运行结果,程序不原创 2014-04-22 10:24:53 · 1197 阅读 · 0 评论 -
非常量引用的初始值必须为左值,常量引用的初始值可以为左值、右值
非常量引用的初始值必须为左值,常量引用的初始值可以为左值、右值原创 2014-01-07 15:15:23 · 3564 阅读 · 1 评论 -
stack and queue
1 stack栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。栈的基本运算有六种:构造空栈:InitStack(S)、判栈空: StackEmpty(S)、判栈满: StackFull(S)、进栈: Push(S,x)、可形象地理解为压入,这时栈中会多一个元素退栈: Pop(S) 、 可形象地理解为弹原创 2013-12-15 14:35:53 · 920 阅读 · 0 评论 -
coredump简介与coredump原因总结
什么是coredump?通常情况下coredmp包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息等。可以理解为把程序工作的当前状态存储成一个文件。许多程序和操作系统出错时会自动生成一个core文件。如何使用coredump?coredump可以用在很多场合,使用Linux,或者solaris的人可能都有过这种经历,系统在跑一些压力测试或者系统负载一大的转载 2013-11-05 20:33:29 · 865 阅读 · 0 评论 -
this指针探秘
bj在它的著作(C++语言的设计与演化 p62)里说在早期的C++里this是一个可以被赋值的东东,只是在继承在堆栈里很难处理,后来才被淘汰掉class X{//...public: X();//...};X::X(){ this=my_alloc(sizeof(X)); //...}X x;//为x分配内存转载 2013-10-29 20:21:27 · 663 阅读 · 0 评论 -
C++友元函数和友元类
1、为什么要使用友元?在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了使其他类的成员函数直接访问该类的私有变量。即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使原创 2013-10-28 19:11:39 · 650 阅读 · 0 评论 -
C++中静态成员函数访问非静态成员变量
class a{public: static FunctionA() { menber = 1; }private: int menber;}编译上述代码,出错。原因很简单大家都知道,静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存。静态成员函数没有隐含的thi转载 2013-10-28 11:00:00 · 1010 阅读 · 0 评论 -
C++引用详解
一谈引用引用(reference)是c++对c语言的重要扩充。 一、引用的概念 引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。 例如: Point pt1(10,10); Point &pt2=pt1; 定义了pt2为pt1的引用。通过这样的定义,pt1和pt2表示同一对象。 需要特别强调的是引用并不产生对象的副本,仅仅是对象的同转载 2013-10-21 16:57:05 · 1028 阅读 · 0 评论 -
C/C++中static关键字详解
参考:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777441.html 静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。用法1:函数内部声明的static变量,可作为对象间转载 2013-10-24 16:05:10 · 579 阅读 · 0 评论 -
细说C++类型转换操作符
C++语言虽然兼容C,也支持C语言的类型转换用法,就是将类型用圆括号括起来,这种转换可视性比较差,难以跟踪错误的转换。C++提供了命名的强制转换操作符,毕竟转换有时是不安全的,所以使用命名转换操作符可以根据所使用的转换操作符可以判断风险级别。下面我们就来看看C++提供的四种命名的强制转换操作符的具体功能和用法。1.const_cast2.static_cast3.r转载 2013-10-17 20:55:38 · 629 阅读 · 0 评论 -
你真的会用 const 吗?
(1)可以定义const常量,具有不可变性。 例如:const int Max=100; int Array[Max]; (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。 例如: void f(const int i) { .........} 编译器就会知道i是一个常量,不允许修改; (3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的原创 2013-10-17 15:50:23 · 1085 阅读 · 0 评论 -
fork后子进程从哪里开始执行
fork确实创建了一个子进程并完全复制父进程,但是子进程是从fork后面那个指令开始执行的。对于原因也很合逻辑,如果子进程也从main开头到尾执行所有指令,那它执行到fork指令时也必定会创建一个子子进程,如此下去这个小小的程序就可以创建无数多个进程可以把你的电脑搞瘫痪,所以fork作者肯定不会傻到这种程度fork和线程,进程的理解本文分为三部分:1. 什么转载 2013-10-11 15:41:54 · 9199 阅读 · 3 评论 -
C++ io流及其标志位
O标准库类型和头文件 头文件 iostream istream从流中读取 ostream写到流中去 iostream对流进行读取;从istream和ostream派生而来 fstream原创 2013-12-24 14:46:42 · 1835 阅读 · 0 评论