- 博客(97)
- 收藏
- 关注
转载 什么是AV错误?我该如何调试它?
当你运行程式得到了一个AV(Access Violation)错误的时候,这意味着你的程式正在试图访问一块不再有效的内存,请注意我所提到的“不再”有效。大多数的情况下,出现这个错误要么是因为你试图访问一块已经被释放的内存,要么是想使用一个还未创建对象的指针。幸运的是:Win32的内存体系在不同的进程(Process)间使用了独立的地址空间。所以我们可以不必担心会访问到其他的进程中的地址
2010-01-19 16:09:00
845
转载 各种排序方法汇总
1. 基本思想: 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。2. 排序过程:【示例】: 初始关键字 [49 38 65 97 76 13 27 49]第一趟排序后 13 [38 65 97 76 49 27 49]第二趟排序后 13 27 [65 97 76 49 38 49]第三趟排序后
2009-12-18 21:39:00
641
转载 string::size_type类型
string::size_type类型 string::size_type类型 从逻辑上来讲,size()成员函数似乎应该返回整型数值,或如2.2节“建议”中所述的无符号整数。但事实上,size操作返回的是string::size_type类型的值。我们需要对这种类型做一些解释。 string类类型和许多其他库类型都定义了一些伙伴类型(companion types)。这些伙伴类型使得库类型的使用
2009-12-17 22:43:00
1515
1
原创 vc的内存对齐
VC下的结构体和类的默认对齐原则:1.各成员变量存放的起始地址相对于结构的起始地址偏移量必须为该变量类型所占用字节的倍数。2.结构总大小必须为结构的字节边界数(结构中占用最大空间的类型所占字节数)的倍数。没有成员变量的结构体或类的大小为1,因为必须保证结构或类的实例在内存中都有唯一的地址。VC中修改默认对齐方式:#pragma pack(push) // 保存对齐状态#pragma pac
2009-12-13 12:20:00
371
原创 再谈内存对齐问题
一、什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某
2009-12-13 12:13:00
352
转载 c语言宏定义的连接符有哪些
c语言宏定义的连接符有哪些 收藏 c语言宏定义的连接符有哪些[此问题的推荐答案](一)宏定义中的## 连接符与# 符 ## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释,但不知道也无所谓。同时值得
2009-12-13 11:53:00
317
转载 malloc函数
原型:extern void *malloc(unsigned int num_bytes); 头文件:#include 或 #include (注意:alloc.h 与 malloc.h 的内容是完全一致的。) 功能:分配长度为num_bytes字节的内存块 说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。 当内存不再使用时,应使用free()函
2009-12-08 22:10:00
270
转载 C/C++ 误区 —— 强制转换 malloc() 的返回值
首先要说的是,使用 malloc 函数,请包含 stdlib.h(C++ 中可以是 cstdlib) ,而不是 malloc.h 。因为 malloc.h 从来没有在 C 或者 C++ 标准中出现过!因此并非所有编译器都有 malloc.h 这个头文件。但是所有的 C 编译器都应该有 stdlib.h 这个头文件。 在 C++ 中,强制转换 malloc() 的返回值是必须的,否则不
2009-12-08 21:46:00
691
原创 字符全排列 算法及其思想
在网上找了很久 看明白了这个程序的思路inline void Swap(char& a, char& b) {// 交换a和b char temp = a; a = b; b = temp; } void Perm(char list[], int k, int m) { //生成list [k:m ]的所有排列方式 int i; if (k == m) {//输出一个排列
2009-12-08 17:22:00
1122
1
转载 约瑟夫环数学解法
学了四年,还是不一样的。当年大一时约瑟夫环是个啥都理解了半天,现在可以在十分钟里面自己写个算法了,真是值得纪念。约瑟夫环:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。例如:n = 9, k = 1, m = 5【解答】出局人的顺
2009-12-08 16:29:00
956
3
原创 C++静态存储区栈堆区别
学习C++如果不了解内存分配是一件非常可悲的事情。而且,可以这样讲,一个C++程序员无法掌握内存、无法了解内存,是不能够成为一个合格的C++程序员的。 一、内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数
2009-12-06 12:39:00
386
转载 静态存储区、堆和栈的区别
一、内存基本构成可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器
2009-11-20 16:34:00
431
转载 线程同步机制的区别与比较及进程通信方法
有关多线程的一些技术问题:1、 何时使用多线程?2、 线程如何同步?3、 线程之间如何通讯?4、 进程之间如何通讯? 先来回答第一个问题,线程实际主要应用于四个主要领域,当然各个领域之间不是绝对孤立的,他们有可能是重叠的,但是每个程序应该都可以归于某个领域:1、 offloading time-consuming task。由辅助线程来执行耗时计算,而使GU
2009-11-11 00:49:00
384
转载 多线程编程同步技巧
简介本文探讨基本的同步概念,并实际动手帮助新手掌握多线程编程。本文的重点在各种同步技巧。基本概念在线程执行过程中,或多或少都需要彼此交互,这种交互行为有多种形式和类型。例如,一个线程在执行完它被赋予的任务后,通知另一个线程任务已经完成。然后第二个线程做开始剩下的工作。下述对象是用来支持同步的:1)信号量2)互斥锁3)关键区域4)事件每个对象都有不同的目的和
2009-11-11 00:36:00
429
转载 在C++中,为什么构造函数不能有返回值?
(1)假设有一个类C,有如下定义:class C{public: C():x_(0) {} C(int i):x_(i) {}private: int x_;};如果C的构造函数可以有返回值,比如int: int C():x_(0) { return 1; //1表示构造成功,0表示失败}那么下列代码会发生什么事呢?C c=C(); //此时c.x_==1!很明显,C()调用了C
2009-11-08 16:35:00
828
转载 delete p和delete[] p的区别
原文: operator new 和 operator delete函数有两个重载版本,每个版本支持相关的new表达式和delete表达式: void* operator new (size_t); // allocate an object void* operator new [] (size_t); // allocate an array
2009-11-07 20:41:00
6705
3
转载 Keil C中用unsigned long要注意的问题
Keil C里用到了unsigned long长整型变量,编译时都能通过,但运行时老是溢出,同伙百度到了此贴,解决了问题,于是转帖于此:今天调试一个乘法,出了点问题,先看代码示意:void test(void){ unsigned long mid1,mid2,mid3; mid1=6*10000;//index1 mid2=7*100
2009-11-06 23:07:00
3835
1
转载 对进程、线程、应用程序域的理解
谈谈进程、线程、应用程序域的区别,虽然能说上来几点,但感觉理解的很肤浅、很不透彻,闲暇时从书箱里翻出尘封已久的《操作系统》(还好,毕业时偶没舍得卖),翻了翻进程的那一章。看之前我列出了下面三个问题:1. 这些概念(技术)出现的背景以及要解决的问题 (要干什么)2. 它们之间的联系与区别3. 三者之间的发展脉络进程的出现:(复习功课嘛,就把相关的内容都看看了,哎,都忘的差不多了)进程由操作系统创
2009-11-06 19:52:00
402
转载 C++成员初始化列表
类对象的构造顺序是这样的:1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员 初始化阶段可以是显式的或隐式的,取决于是否存在成员初始化表。隐式初始化阶段按照声明的顺序依次调用所有基类的缺省构造函数,然后是所有成员类对象的缺省构造函数。2.进入构造函数后在构造函数中执行一般计算 计算阶段由构造函数体内的所有语句构成。在计算阶段中,数据成员的设置被认为是赋值,而
2009-11-06 00:10:00
454
1
转载 虚拟继承,虚基类
虚拟继承与虚基类实际上是说了同一件事,只是不同的书表达不同,在这里还是推荐虚拟继承这种说法(因为有人总问虚基类是什么,这里可以解释为虚基类就是虚拟继承,一种继承的方式,有的书偏要把一个动作写成一个名词,不负责任)。虚拟继承是C++继承的一个特殊方法,用来达到特殊的目的。要达到什么目的呢?那就是避免继承机制下的二义性问题(二义性:程序产生两种或多种可能,把编译器搞的不知所措) 继承机制下的
2009-11-02 10:32:00
424
转载 c++ 类中static变量初始化问题
首先static变量只有一次初始化,不管在类中还是在函数中..有这样一个函数:view plaincopy to clipboardprint?void Foo() { static int a=3; // initialize std::cout a++; } void Foo(){ static int a=3; // initialize
2009-10-31 10:31:00
700
原创 用循环数组实现队列
我们可以将队列当作一般的表用数组加以实现,但这样做的效果并不好。尽管我们可以用一个游标last来指示队尾,使得Enqueue运算可在O(1)时间内完成,但是在执行Dequeue时,为了删除队头元素,必须将数组中其他所有元素都向前移动一个位置。这样,当队列中有n个元素时,执行Dequeue就需要O(n)时间。为了提高运算的效率,我们用另一种方法来表达数组中各单元的位置关系。设想数组Q[1..Ma
2009-10-27 15:15:00
2750
原创 C++内存管理之一(检测内存泄露)
C++程序的复杂性很大一部分在于他的内存管理,没有C#那样的垃圾回收机制,内存管理对初学者来说很困难。经常会出现内存泄露的情况。那么我们写程序如何避免内存泄露呢?首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复。 本文描述了如何检测内存泄露。最主要的是纯C,C++的程序如何检测内存泄露。 现在有很多专业的检测工具,比如比较有名的BoundsCheck, 但
2009-10-27 10:48:00
377
原创 从一道面试题看指针与数组的区别
题记: 关于指针,推荐看一下csdn飞天御剑流的《再再论指针》,相信对C语言指针会有一个更为清晰全面的理解。 指针是C语言的精华,它是一柄“双刃剑”,用的好与坏就看使用者的功力了。下面就一道面试题,看一下指针与数组的区别。 char *p1, *p2;char ch[12];char **pp;p1 = ch;pp = &ch
2009-10-24 22:47:00
394
原创 记于百度一面后
下午两点质量部的面试,睡到1点,头昏昏的,一路急走到东门口,上了808,赶到普天大厦。七楼进去一看,百度的门面也不算大,呵呵。登记之后问前台要了胸牌,然后赶紧上了个WC准备了一下啊。 出来等了一会,看好多人啊,大部分是北邮的,也有中科院的,faint,看登记薄北理的好像就我一个,心中怒骂。 等的时候偷看了一眼面我的员工名字:刘畅,MS是个GG。看着大家陆陆续续的被叫走啊,心中焦急呢
2009-10-22 15:42:00
472
转载 二叉树遍历(非递归)
基于栈的递归消除递归操作隐式地调用系统栈,使时间和空间性能有比较大的损耗。我们可以根据自己的需要调用合适的栈结构,从而提高效率。以中序遍历为例:void InOrderTraverse(BiTree root) { InitStack(&s); //初始化栈s p=root; while( p!=NULL || !IsEmpty(s) ) { //当前访问节点存在或栈不空 if(p!=NULL)
2009-10-21 22:04:00
398
转载 宏和枚举的区别(#define VS enum)
宏和枚举之间的差别主要在作用的时期和存储的形式不同,宏是在预处理的阶段进行替换工作的,它替换代码段的文本,程序运行的过程中宏已不存在了。而枚举是在程序运行之后才起作用的,枚举常量存储在数据段的静态存储区里。宏占用代码段的空间,而枚举除了占用空间,还消耗CPU资源。 但也不能就此说宏比枚举好,如果需要定义非常多的常量,用一条enum {.....}明显比一大堆define更清晰,枚举也可以用来定义一
2009-09-28 11:29:00
520
转载 拷贝构造函数和赋值运算符的区别[2]
构造函数 构造函数 是一种特殊的方法 主要用来在创建对象时初始化对象 即为对象成员变量赋初始值 总与new运算符一起使用在创建对象的语句中 特别的一个类可以有多个构造函数 可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载 构造函数与其他方法的区别 1.构造函数的命名必须和类名完全相同;而一般方法则不能和类名相同. 2.构造函数的功能主要用于在类的对象创建时定义初始化的状态.它没有
2009-09-28 11:27:00
737
转载 拷贝构造函数和赋值运算符区别[1]
一、拷贝构造,是一个的对象来初始化一边内存区域,这边内存区域就是你的新对象的内存区域赋值运算,对于一个已经被初始化的对象来进行operator=操作class A; A a; A b=a; //拷贝构造函数调用 //或 A b(a); //拷贝构造函数调用 /////////////////////////////////// A a;
2009-09-28 11:24:00
401
转载 C 风格(C-style)强制转型2
C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这样的语法: T(exdivssion) // cast exdivssion to be of type T 这两种形式之间没有本质上的不同,它纯粹就是一个把括号放在哪的问题。我把这
2009-09-28 10:49:00
326
转载 C++的四种cast操作符的区别--类型转换
dynamic_cast: 通常在基类和派生类之间转换时使用,run-time cast const_cast: 主要针对const和volatile的转换. static_cast: 一般的转换,no run-time check.通常,如果你不知道该用哪个,就用这个。 reinterpret_cast: 用于进行没有任
2009-09-28 10:11:00
263
转载 跟类的内存结构有关的
许多同学可能在学习C++的时候,都会感到一定的困惑,继承到底是怎样分配空间的,多态到底是如何完成的,许许多多的问题,必须挖掘到C++底层处理机制,才能搞明白。有许多C程序员也并不认同C++,他们认为C++庞大又迟缓,其更重要的原因是,他们认为“C++是在你的背后做事情”。的确,C++编译器背着程序员做了太多的事情,所以让很多不了解其底层机制的人感到困惑。想成为一个优秀的程序员,那么这样的困惑就不应
2009-09-26 11:15:00
330
原创 存储图片到数据库
sql server2000数据库 保存图片的字段使用image类型 在pb中用fileread()函数把图片读到一个blob型变量中,然后使用 updateblob语句把保存图片的blob型变量存到数据库中 保存image类型的变量要注意两点 1.autocommit属性要设者为true (sqlca.autocommit=true
2009-09-25 21:22:00
361
转载 Stack和Heap的区别
【继续深入】Stack和Heap的区别(1)每个应用程序运行时,都有属于自己的一段内存空间,用于存放临时变量、参数传递、函数调用时的PC值的保存。这叫stack。(2)所有的应用可以从一个系统共用的空间中申请供自己使用的内存,这个共用的空间叫heap。(3)stack中的对象或变量只要定义好就可使用了,应用程序结束时会自动释放。(4)而要使用heap中申请的变量或对象只能定义变量指针,并要求在运行
2009-09-25 20:42:00
233
原创 进程和线程的区别
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行
2009-09-25 20:29:00
332
原创 sqlserver只有MDF文件恢复数据库的方法[转帖]
在查询中执行下列语句 EXEC sp_attach_single_file_db @dbname = testdb, @physname = E:/Test/testdb.MDF 注:testdb 为恢复的数据库名 E:/Test/testdb.MDF 为MDF文件的物理路径
2009-09-24 15:31:00
267
原创 VC++6.0中的预编译头
在很多程序中,每个源文件都存在一些相同的部分。比如要包括相同的一些头文件,而且这些头文件可能很长,例如window.h。如果用普通的方法编译这些源文件,对这些头文件在每个源文件中的出现都要重新编译,作了很多重复工作。如果能将这些头文件专门进行编译,并且把结果存储起来。然后在编译包含这些头文件的源文件时,使用上述结果替代头文件在源文件中的出现,就可以大大减少工作量。Microsoft Visual
2009-09-17 10:00:00
1116
原创 DirectShow编程
最近一段时间,在编写DirectShow应用程序时常常遇到一些问题,原因是对DirectShow技术没有较全面地掌握,对各个接口间的关系以及filter与filter之间连接的内部过程等都只是一知半解,除了再仔细地看看DirectShow的基类库源文件之外,觉得也很有必要从头到尾看一遍DirectShow的MSDN文
2009-09-15 16:59:00
1323
转载 [zz]C++中成员初始化列表的使用
C++在类的构造函数中,可以两种方式初始化成员数据(data member)。 1,在构造函数的实现中,初始类的成员数据。诸如:class point{private: int x,y;public: point(int m=0,int n=0) { x=m; y=n; } int GetX() { return x; } int GetY() { return y; }};2,还可以定
2009-09-11 15:48:00
351
转载 [zz]内部排序算法比较
排序算法是数据结构学科经典的内容,其中内部排序现有的算法有很多种,究竟各有什么特点呢?本文力图设计实现常用内部排序算法并进行比较。分别为起泡排序,直接插入排序,简单选择排序,快速排序,堆排序,针对关键字的比较次数和移动次数进行测试比较.问题分析和总体设计ADT OrderableList{数据对象:D={ai| ai∈IntegerSet,i=1,2,…,n,n≥0}数据关系:R1={〈a
2009-09-07 10:00:00
292
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人