C++
文章平均质量分 66
jxhgh
这个作者很懒,什么都没留下…
展开
-
多线程互斥同步的问题
GNU/Linux中解决多线程互斥同步问题的分析和说明(http://blog.chinaunix.net/u1/35100/showart.php?id=274716)当解决多线程互斥同步的问题时,经常会有如下几个问题:1. 在一个给定的问题中,需要多少个Mutex,多少个Semaphore?有什么规律?2. 在对临界区加锁和等待信号量的顺序上有什么要求和规律?3. 什么样操作适转载 2012-06-29 08:39:56 · 316 阅读 · 0 评论 -
函数 snprintf
头文件 #include int snprintf(char *str, size_t size, const char *format, ...)最多从源串中拷贝size-1个字符到目标串中,然后再在后面加一个’\0’。所以如果目标串的大小为size的话,将不会溢出。char *str:目标数组地址size_t size:目标数组大小(一般用sizeof()表示)原创 2015-02-26 11:08:26 · 557 阅读 · 0 评论 -
C++ 堆和栈的解说
一、程序的内存分配(一个由c/C++编译的程序占用的内存分为以下几个部分)1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全转载 2015-06-26 15:10:57 · 330 阅读 · 0 评论 -
C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast
在C++中,存在类型转换,通常意味着存在缺陷(并非绝对)。所以,对于类型转换,有如下几个原则:(1)尽量避免类型转换,包括隐式的类型转换(2)如果需要类型转换,尽量使用显式的类型转换,在编译期间转换(3)避免使用reinterpret_cast和老式的强制类型转换操作符通常,隐式的类型转换会导致警告,需要重视这些警告,并使用显式的类型转换代替,例如static_cast代替一些算术转载 2015-06-28 22:20:24 · 256 阅读 · 0 评论 -
C/C++中const关键字详解
为什么使用const?采用符号常量写出的代码更容易维护;指针常常是边读边移动,而不是边写边移动;许多函数参数是只读不写的。const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替),分类如下: 常变量: const 类型说明符 变量名 常引用: const 类型说明符 &引用名 常对象: 类名 const 对象名转载 2015-06-28 21:39:36 · 242 阅读 · 0 评论 -
C/C++中static关键字详解
静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。用法1:函数内部声明的static变量,可作为对象间的一种通信机制 如果一局部变量被声明为static,那么将只有唯一的一个静态分配的对象,它被用于在该函数的所有调用中表示这个变量。这个对象将只在转载 2015-06-28 22:03:10 · 198 阅读 · 0 评论 -
揭密extern "C"
1. 深层揭密extern "C" extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。让我们来详细解读这两重含义。(1)被extern "C"限定的函数或变量是extern 类型的; extern 是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变转载 2015-06-28 22:28:04 · 241 阅读 · 0 评论 -
memcopy和memmove的区别
memcpy:c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。memmove:memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域转载 2015-07-13 10:51:43 · 439 阅读 · 0 评论 -
如何在delete一个void *对象后有效执行析构函数
正常情况下:classT *pA = new classT();delete pA;很容易实现完成。如下代码就会有些需要注意的地方:classT *pA= new classT();void *pHandle = pA;delete pHandle; //这里就不能有效的执行析构函数,可能会造成内存泄漏。怎么办呢?其实和很简单,如下就可以。delete (原创 2015-07-16 17:07:39 · 873 阅读 · 0 评论 -
Placement new、operator new、new operator 完全释疑
首先我们区分下几个容易混淆的关键词: new(也称作new operator)、operator new、placement new。看如下代码: 1: class MyClass {...}; 2: MyClass *p = new MyClass; 这里的new是上述三个关键字中的第一个,成为new操作符。实际上它执行如下3个过转载 2015-07-16 17:14:47 · 200 阅读 · 0 评论 -
C# 调用 C++ dll出错
由于各自使用的调用规则不同,导致DLL回调或C#调用返回时系统直接calldown,可能原因如下:并不是所有的语言都支持_cdcel调用规则,但是都支持_sdtcall调用规则, 假如你用VC做了一个DLL,导出了某些函数,如果你想这个DLL被其他语言也能调用的话,VB.DEPHI.PB..你的把他的调用约定声明为__stdcallwindows api都是_stdcall调用规则,函数调原创 2015-10-31 09:13:35 · 481 阅读 · 0 评论 -
HeapAlloc、VirtualAlloc、GlobalAlloc和LocalAlloc、 alloc、new
1. HeapAlloc:MSDN上的解释为:HeapALloc是从堆上分配一块内存,且分配的内存是不可移动的(即如果没有连续的空间能满足分配的大小,程序不能将其他零散的空间利用起来,从而导致分配失败),该分配方法是从一指定地址开始分配,而不像GloabalAlloc是从全局堆上分配,这个有可能是全局,也有可能是局部。函数原型为:LPVOIDHeapAlloc( HAND转载 2016-06-24 17:15:25 · 275 阅读 · 0 评论 -
C语言指针的长度和类型
如果考虑应用程序的兼容性和可移植性,指针的长度就是一个问题,在大部分现代平台上,数据指针的长度通常是一样的,与指针类型无关,尽管C标准没有规定所有类型指针的长度相同,但是通常实际情况就是这样。但是函数指针长度可能与数据指针的长度不同。指针的长度取决于使用的机器和编译器,例如:在现代windows上,指针是32位或是64位长测试代码:#include#include#in转载 2016-09-11 16:05:53 · 1014 阅读 · 0 评论 -
sizeof
1、什么是sizeof 首先看一下sizeof在msdn上的定义: The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type转载 2016-09-11 16:09:52 · 212 阅读 · 0 评论 -
函数 memcmp
int memcmp (const void *a1, const void *a2, size_t size) 原型是:extern int memcmp(void *buf1, void *buf2, unsigned int count);功能上来说是比较a1和a22个buff内的前size个字节,如果相同返回的结果是0当buf1当buf1=buf2时,返回值=0当buf原创 2015-02-25 16:40:17 · 626 阅读 · 0 评论 -
函数 strncmp
strncmp(const char * a1,const char *a2,int maxlen)与上面的函数类似),用来比较a1和a2两个字符串的,但是之比较两个字符串的钱maxlen长度的字符串当a1当a1>a2时候,返回的值>0当a1=a2时候,返回的值=0函数实现代码:/*** strncmp - Compare two length-limited str原创 2015-02-25 16:33:44 · 274 阅读 · 0 评论 -
函数 memcpy
memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。该函数将一个大小为size的内存段的值拷贝到另一内存段中。函数原型及实现:void *memcpy(void *memTo, const void *memFrom, size_t size) { assert((memTo != NULL) && (memFrom != NUL原创 2015-02-25 14:24:37 · 253 阅读 · 0 评论 -
VS2005添加lib
fromhttp://hi.baidu.com/mailrabbit/blog/item/a5e199ca7e6227f253664f61.htmlVS 2005项目中添加lib库 应用程序使用外部库时需要进行加载,两种库的加载本质上都是一样:提供功能和功能的定义。vs2005 c++ 项目设置外部库方法如下:1. 添加编译所需要(依赖)的 lib 文件转载 2012-12-06 11:08:15 · 269 阅读 · 0 评论 -
非托管C++代码调用C#编写的dll方法
CLR VIA C#这本书里面的内容,在网上好像很少关于这方面的内容,贴出来以后留着看。C#调用C++编写的dll,一般都是直接用dllimport,这个资料很多。C++调用C#编写的dll,一般方法都是先用托管C++将C#的dll进行一次封装,然后由非托管C++调用封装好的dll。CLR VIA C#在讲寄宿和应用程序域的内容时,提供了一个非托管C++直接调用的方法。原理就是,在非托转载 2013-05-27 10:35:50 · 646 阅读 · 0 评论 -
关键字-implicit
implicit 关键字用于声明隐式的用户定义类型转换运算符。如果转换过程可以确保不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进行隐式转换。备注:隐式转换可以通过消除不必要的类型转换来提高源代码的可读性。但是,因为隐式转换不需要程序员将一种类型显式强制转换为另一种类型,所以使用隐式转换时必须格外小心,以免出现意外结果。一般情况下,隐式转换运算符应当从不引发异常并且从不丢失原创 2014-02-10 13:49:13 · 402 阅读 · 0 评论 -
C++函数后面的throw()
它是函数提供者和使用者的一种君子协定,标明该函数不抛出任何异常。之所以说是君子协定,是因为实际上内部实现是需要人肉确保。 如果一个标明throw()的函数内部发生了throw:1,如果内部直接throw something,编译器会发现并指出;2. 如果是内部调用了一个可能throw something的函数,编译器无法发现,运行时一旦这个内部的函数throw,程序会abort。原创 2014-02-10 15:14:41 · 1374 阅读 · 0 评论 -
关键字-explicit
explicit用来修饰类的构造函数,是为了防止隐式使用拷贝构造函数的,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?如果c++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示:class MyClass { public: MyClass( int n原创 2014-02-10 13:29:31 · 373 阅读 · 0 评论 -
杂谈-C++
****关于类的提前引用声明**** 一般情况下,类必须先声明(给出类体),才能使用。如果需要在类声明之前,使用该类的名字去定义指向该类对象的指针或引用,可以使用提前引用声明。如上例所示,class Date; //对Date类的提前引用声明…void call(Date &);//Date类的引用…class Date{…}//Date类的声明但不能因为提前引用原创 2014-02-10 11:00:28 · 390 阅读 · 0 评论 -
关键字-friend
友元函数 如果在本类以外的其它地方定义了一个函数(这个函数可以是不属于任何类的非成员函数,也可以是其它类的成员函数),在类体中用friend对该函数进行声明,此函数就称为本类的友元函数。一个类的友元函数可以访问这个类中的private成员。1.1将全局函数声明为友元函数 如果要将一个全局函数(call)声明为本类(Time)的友元函数,则只需要在本类的函数声明部分声明该函数原创 2014-02-10 10:51:10 · 325 阅读 · 0 评论 -
关键字-operator
http://blog.sina.com.cn/s/blog_4b3c1f950100kker.htmloperator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都转载 2014-02-10 14:19:26 · 467 阅读 · 0 评论 -
函数 strcpy
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。函数原型及实现:char* strcpy(char* strDst, const char* strSrc) { assert((strDst != NULL) && (strSrc != NULL)); char* address = strD原创 2015-02-25 14:13:54 · 318 阅读 · 0 评论 -
GCC 编译动态库和静态库
我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。本文主要通过举例来说明在Linux中如何创建静态库和动态库,以及使用它们。在创建函数库前,我们先来准备举例用的源程序,并将函转载 2015-02-25 14:47:45 · 328 阅读 · 0 评论 -
函数 strcmp
strcmp(const char * a1,const char *a2)用来比较a1和a2两个字符串(按ASCII值大小相比较),注意点是这个函数只能用来比较字符串当a1当a1>a2时候,返回的值>0当a1=a2时候,返回的值=0函数实现代码:/*** strcmp - Compare two strings* @cs: One string* @ct: An原创 2015-02-25 16:27:35 · 288 阅读 · 0 评论 -
函数 sprintf
头文件: stdio.h字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。int sprintf( char *buffer, const char *format, [ argument] … );buffer:char型指针,指向将要写入的字符串的缓冲区。format:格式化字符串。[argument]...:可选参数,可以是任何类型的数据。返原创 2015-02-26 10:46:57 · 205 阅读 · 0 评论 -
函数 strncpy
该函数用于拷贝count个字符。函数原型及实现:char *strncpy(char *dst, const char *src, size_t count){ assert((dst != NULL) && (src != NULL)); char *tmp = dst; while (count-- && (*dst++ = *s原创 2015-02-25 14:18:45 · 300 阅读 · 0 评论 -
winbug分析dmp文件
前言:WinDbg是微软开发的免费源代码级的调试工具。WinDbg可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。本文的讨论是在安装了Debugging Tools for Windows 的前提下进行的,下载地址。WinDbg对于dump文件的调试可以通过菜单设置Symbol File Path、Source File Path ,并可设置多个路径。1、 打开Dum转载 2016-12-07 15:51:54 · 1755 阅读 · 0 评论