随笔分类 -  c/c++

c++中的new_handler
摘要:原文地址:http://blog.csdn.net/wzq981264/article/details/673630在过去或者传统的模式中,当operator new不能满足一个内存分配请求的时候,它会返回一个空指针,但是现在如果operator new不能满足一个内存分配请求的时候,会抛出一个异常,这个时候我们可不可以自己定制处理策略呢?这正是new_handler的作用所在,具体情况在后面详细道来。 当operator new申请一个内存失败时,它会进行如下的处理步骤: 1、如果存在客户指定的处理函数,则调用处理函数(new_handler),如果不存在则抛出一个异常。new_han... 阅读全文

posted @ 2013-04-04 21:58 zhuyf87 阅读(3297) 评论(0) 推荐(0)

c++ placement new的标准用法及用途
摘要:原文地址:http://blog.csdn.net/lazyking/article/details/5319580什么是placement new?所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可。举例来说:class foo{};foo* pfoo = new foo;pfoo指向的对象的地址是不能决定的,因为new已经为我们做了这些工作:第一步分配内存,第二步调用类的构造函数。而placement new是怎么做的呢,说白了就是把原本new做的两步工作分开来。第一步你自己分配内存,第二步你调用类的构造函数在 阅读全文

posted @ 2013-03-23 10:58 zhuyf87 阅读(1090) 评论(0) 推荐(0)

c++ new的三种形态
摘要:(1)new operatornew的第一种形态是new operator,它是语言内建的,不能重载。new operator完成以下三件工作:1. allocate memory for this object.2. call constructor to init that memory.3. return the pointer of this object.例如:string *pStr = new string(“Memory Management”);它实际完成以下三件事:// 1. 为string对象分配raw内存void *memroy = operator new( size 阅读全文

posted @ 2013-03-23 10:20 zhuyf87 阅读(1148) 评论(0) 推荐(2)

(visual)c++ 内存分配
摘要:“烫”和“屯”在vc++中,栈中未初始化的内存在变量监视窗口总是显示为一串“烫”字;而堆中未初始化的内存则显示一串“屯”字。原因是:vc++编译器对栈中未初始化的内存默认设置为0xcc,而两个0xcc,即0xcccc在GBK编码中就是“烫”;而堆中未初始化的内存默认设置为0xcd,而0xcdcd在GBK编码中则是“屯”。内存分配方式程序运行时,首先要被加载到内存,程序在内存中的布局大致如下图:代码区存放程序的执行代码。数据区存放全局数据、常量、静态变量,所以在c++中数据区又可分为自由存储区(自由存储区是那些由malloc等分配的内存块,它和堆十分相似,不过它是由free来释放的)、全局/静态 阅读全文

posted @ 2013-03-18 14:38 zhuyf87 阅读(1299) 评论(0) 推荐(0)

c++ new delete
摘要:当创建一个c++对象时,会发生两件事:(1)为对象分配内存。(2)调用构造函数初始化这块内容。这块内存可以位于3个区域:静态存储区、栈、堆。operator new当用new创建一个对象时,它将在堆里为对象分配内存(使用“operator new()”)并为这块内存调用构造函数。MyType * fp = new MyType;operator delete与new结合使用。delete先调用析构函数,然后释放内存。delete fp;同一指针delete两次会产生未定义行为(程序可能崩溃),所以在delete某一指针之后最好将其置0,因为delete零值指针是安全的(其行为是什么都不做)。当 阅读全文

posted @ 2013-03-17 20:10 zhuyf87 阅读(827) 评论(0) 推荐(0)

c++ RTTI(运行时类型识别)
摘要:通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型。c++通过下面两个操作符提供RTTI。(1)typeid:返回指针或引用所指对象的实际类型。(2)dynamic_cast:将基类类型的指针或引用安全的转换为派生类型的指针或引用。对于带虚函数的类,在运行时执行RTTI操作符,返回动态类型信息;对于其他类型,在编译时执行RTTI,返回静态类型信息。当具有基类的指针或引用,但需要执行派生类操作时,需要动态的强制类型转换(dynamic_cast)。这种机制的使用容易出错,最好以虚函数机制代替之。dynamic_cast 操作符如果dynamic_cast转换指针类型失败,则返回0; 阅读全文

posted @ 2013-03-15 10:33 zhuyf87 阅读(19767) 评论(0) 推荐(2)

c++ stl algorithm: std::find, std::find_if
摘要:原文地址:http://blog.csdn.net/ilysony/article/details/6526545std::find:查找容器元素, find只能查找容器元素为<基本数据类型>#include <iostream>#include <vector>#include <algorithm>int main(){ std::vector<int> v; for (int i = 0; i < 10; ++i) v.push_back(i); std::vector<int>::iterator iter 阅读全文

posted @ 2013-03-13 14:06 zhuyf87 阅读(5684) 评论(0) 推荐(0)

vc++ warning C4541 'typeid' used on polymorphic type with GR-
摘要:在vc2008编译器下使用c++ typeid操作符时,提示如下警告,并在运行时崩溃。warning C4541: 'typeid' used on polymorphic type 'XXX' with /GR-; unpredictable behavior may result.在vc++编译器中,“/GR”选项的作用如下:When /GR is on, the compiler defines the _CPPRTTI preprocessor macro./GR- disables run-time type information.Use /GR i 阅读全文

posted @ 2013-03-13 09:45 zhuyf87 阅读(1052) 评论(0) 推荐(0)

多态基类的析构函数应该为虚函数
摘要:#include<iostream>using namespace std;class CBird{public: CBird() { cout << "CBird constructor." << endl; }; ~CBird() { cout << "CBird destructor." << endl; }; virtual void fly() { cout << "CBird fly." << endl; };};class CLark : 阅读全文

posted @ 2013-03-12 09:37 zhuyf87 阅读(4222) 评论(0) 推荐(0)

c/c++ 位操作的趣味应用
摘要:原文地址:http://blog.csdn.net/morewindows/article/details/7354571(代码部分,略作删减;加下划线部分,是后加内容,非原文内容)位操作有很有趣的应用,下面列举出一些,欢迎读者补充。1. 高低位交换给出一个16位的无符号整数。称这个二进制数的前8位为“高位”,后8位为“低位”。现在写一程序将它的高低位交换。例如,数34520用二进制表示为:1000011011011000将它的高低位进行交换,我们得到了一个新的二进制数:1101100010000110它即是十进制的55430。这个问题用位操作解决起来非常方便,设x=34520=1000011 阅读全文

posted @ 2013-03-10 15:00 zhuyf87 阅读(1575) 评论(0) 推荐(0)

c/c++ 位操作与空间压缩
摘要:原文地址:http://blog.csdn.net/morewindows/article/details/7354571(加下划线部分,是后加内容,非原文内容)这里不详细介绍筛素数法,本文着重对筛素数法所使用的素数表进行优化来减小其空间占用。要压缩素数表的空间占用,可以使用位操作。下面是用筛素数法计算100以内的素数示例代码(这种筛素数的方法很朴素,会多次重复访问素数表中的同一数据,改进方法请参看《改进的筛素数方法》一文):#include <stdio.h>#include <memory.h>const int MAXN = 100;bool flag[MAXN] 阅读全文

posted @ 2013-03-10 13:54 zhuyf87 阅读(1083) 评论(0) 推荐(0)

c/c++ 位操作 常用小技巧
摘要:原文地址:http://blog.csdn.net/morewindows/article/details/7354571(加下划线部分,是后加内容,非原文内容)下面对位操作的一些常见应用作个总结,有判断奇偶、交换两数、变换符号及求绝对值。这些小技巧应用易记,应当熟练掌握。1.判断奇偶根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数。下面程序将输出0到100之间的所有奇数。for (i = 0; i < 100; ++i) if (i & 1) printf(" 阅读全文

posted @ 2013-03-10 12:31 zhuyf87 阅读(893) 评论(0) 推荐(0)

c/c++ 位操作基础
摘要:原文地址:http://blog.csdn.net/morewindows/article/details/7354571#quote(这里将原文分为4部分分别转载)在计算机中所有数据都是以二进制的形式存储的。位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。在实际编程中,如果能巧妙运用位操作,完全可以达到四两拨千斤的效果。正因为位操作的这些优点,所以位操作在各大IT公司的笔试面试中一直是个热点问题。基本的位操作符有与、或、异或、取反、左移、右移这6种,它们的运算规则如下所示:符号描述运算规则 by MoreWindows&与两个位都为1时,结果才为1|或两个 阅读全文

posted @ 2013-03-10 11:31 zhuyf87 阅读(291) 评论(0) 推荐(0)

【面试题】计算整数符号
摘要:题目:计算一个整数的符号位int v; // we want to find the sign of vint sign; // the result goes here不能使用函数,不能使用if,不能使用“?:”三目运算符…总而言之,本题主要考查的是“位操作、逻辑操作、关系操作”。在google里面输入“Compute the sign of an integer”,搜到一篇强文,里面也包括了这道题目的答案。地址:http://graphics.stanford.edu/~seander/bithacks.html这里把文中关于本题的解答引用如下:Compute the sig... 阅读全文

posted @ 2013-03-09 20:26 zhuyf87 阅读(479) 评论(0) 推荐(0)

原码, 反码, 补码 详解
摘要:原文地址:http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助!一. 机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.1、机器数一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负 阅读全文

posted @ 2013-03-07 15:05 zhuyf87 阅读(644) 评论(0) 推荐(0)

一道 c++字符串 面试题
摘要:c/c++ 中的字符串以“\0”作为结尾符,这样每个字符串都有一个额外字符的开销。下面代码将造成内存越界。char str[10];strcpy(str, “0123456789”);为了节省内存,c/c++ 会把常量字符串放到单独的一个内存区域。当几个指针赋予相同的常量字符串时,它们实际上会指向相同的内存地址。char str1[] = "hello world";char str2[] = "hello world";char *str3 = "hello world";char *str4 = "hello world 阅读全文

posted @ 2013-03-07 10:35 zhuyf87 阅读(944) 评论(0) 推荐(0)

c++中 typename 和 class 的区别
摘要:原文地址:http://blog.163.com/susu_sf/blog/static/171060253201092233759957/在c++Template中,很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?相信学习C++的人对class这个关键字都非常明白,class用于定义类。在模板引入c++后,最初定义模板的方法为: template<class T>......在这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字。它的作用同cl 阅读全文

posted @ 2013-03-04 07:11 zhuyf87 阅读(1516) 评论(0) 推荐(0)

c++模板与泛型编程基础
摘要:泛型编程就是以独立于任何特定类型的方式编写代码,而模板是泛型编程的基础。(1)定义函数模板(function template)函数模板是一个独立于类型的函数,可以产生函数的特定类型版本。// implement strcmp-like generic compare functiontemplate <typename T>int compare(const T &v1, const T &v2){ if (v1 < v2) return -1; if (v2 < v1) return 1; return 0;}模板定义以关键字template开始,后 阅读全文

posted @ 2013-03-04 07:05 zhuyf87 阅读(28337) 评论(0) 推荐(4)

数组形参退化为指针
摘要:【面试题】以下代码的输出结果是?int GetSize(int data[]){ return sizeof(data);}int main(){ int data1[] = {1, 2, 3, 4, 5}; int size1 = sizeof(data1); int *data2 = data1; int size2 = sizeof(data2); int size3 = GetSize(data1); printf(“%d, %d, %d”, size1, size2, size3);}正确的输出结果应该是“20, 4, 4”,(假设是32位系... 阅读全文

posted @ 2013-02-28 09:34 zhuyf87 阅读(270) 评论(0) 推荐(0)

x&(x-1) 表达式
摘要:【面试题】以下代码结果是多少?#include <iostream>using namespace std;int func(int x){ int count = 0; while(x) { count++; x = x&(x-1); } return count;}int main(){ cout << func(9999) << endl; return 0;}func函数返回值是形参x转化为二进制后包含1的数量。每次while循环,执行一次x = x&(x-1),会将x用二进制表示时最右边的一个1变为0,同时coun... 阅读全文

posted @ 2013-02-27 09:46 zhuyf87 阅读(2725) 评论(0) 推荐(1)

导航