C/C++
文章平均质量分 63
maocl1983
这个作者很懒,什么都没留下…
展开
-
浅谈C/C++内存泄漏及其检测工具(1)
原文地址:http://dev.yesky.com/147/2356147.shtml对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题,比如Smart Pointer,Garbage Collection等。Smart Pointer技术比较成熟,STL中已经包含支持Smart Pointer的class,但是它的使用似乎并不广泛,而转载 2010-01-21 13:54:00 · 482 阅读 · 0 评论 -
关于时间的操作
1、时间类型。 Linux下常用的时间类型有4个:time_t,struct timeval,struct timespec,struct tm。(1)time_t是一个长整型,一般用来表示用1970年以来的秒数。 time_t long integer (2)struct timeval有两个成员,一个是秒,一个是微妙。 struct timeval {原创 2010-04-29 11:05:00 · 785 阅读 · 0 评论 -
c++ 之类的前置声明
原文地址:http://software.intel.com/zh-cn/blogs/2010/05/04/c-2/?cid=sw:prccsdn1073 刚开始学习c++的人都会遇到这样的问题:定义一个类 class A,这个类里面使用了类B的对象b,然后定义了一个类B,里面也包含了一个类A的对象a,就成了这样:一编译,就出现了一个互包含的问题了,这时就有人跳出来说转载 2010-05-07 14:34:00 · 521 阅读 · 0 评论 -
关于rand()和srand()的理解
函数一:int rand(void);从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。函数二:void srand(unsigned seed); 参数seed是rand()的种子,用来初始化rand()的起始值。 如果在rand()之前没有调用srand (),它会自动调用srand(1)一次。可以把随机数列原创 2010-05-07 14:05:00 · 736 阅读 · 0 评论 -
函数指针数组的点滴
以下内容摘至《C++编程思想》:#include using namespace std; #define DF(N) void N(){cout DF(a);DF(b);DF(c);DF(d);void (*func_table[])()={a,b,c,d};int main() { while(1){ cout char原创 2010-05-08 23:24:00 · 466 阅读 · 0 评论 -
关于map使用失误
今天又犯了个错误:原先 typedef std::map XXXMap;XXXMap xxx;然后在退出时删除:for (XXXMap::iterator it = xxx.begin(); it != xxx.end(); ++it) { delete it->second;}这个没问题。一切OK。后来修改: typedef std::map XXX> XXXMap;XXXMap x原创 2010-05-11 17:29:00 · 1751 阅读 · 0 评论 -
重载转换操作符
转换操作符是一种特殊的类成员函数。将类类型值转变为其他类型值的转换。operator type()必须是成员函数,不能指定返回类型,并且形参表必须为空 例如:class Test {public: Test(int t){ t_ = t; } ~Test(){} //operator int(){ return t_; } operato原创 2010-05-16 12:21:00 · 519 阅读 · 0 评论 -
关于memset的慎用
先看一段代码:#include #include using namespace std;struct test_t { test_t() { memset(this, 0, sizeof(test_t)); } uint32_t a; uint32_t add() {原创 2010-05-18 19:20:00 · 1269 阅读 · 0 评论 -
关于std::vector指针的下标“[]”的使用
#include #include #include #include using namespace std;struct test_t { uint32_t a; uint32_t b;};int main(int argc, char *argv[]){ test_t t; memset(&t, 0x00, sizeof(test_t));原创 2010-05-21 16:40:00 · 7425 阅读 · 0 评论 -
小心使用定时器时发生的内存泄露
今天实现如下代码:struct info_t { uint32_t id; uint32_t count;}; void use_timer(uint32_t uid){ //... info_t* info = reinterpret_cast(g_slice_alloc0(sizeof(info_t))); info->id = uid; info->c原创 2010-05-28 10:09:00 · 1661 阅读 · 0 评论 -
简单而容易忽略的类型转换问题
<br />先看以下代码:<br />uint8_t get_stage(uint16_t cur_val, uint16_t init_val)<br />{<br /> uint8_ state = 0;<br /> float rate = cur_val / init_val;<br /> if (rate > 0.5) {<br /> state = 10;<br /> } else if (rate > 0.2) {<br /> state = 20;<br /> } else if (ra原创 2010-06-08 22:43:00 · 672 阅读 · 0 评论 -
关于offsetof()的warning!
<br />先不多说,直接上程序:<br />#include <cstdlib><br />#include <iostream><br />#include <sstream><br />#include <stdexcept><br />#include <cstring><br />#include <map><br /><br />using namespace std;<br /> <br />struct test {<br /> uint32_t a;<br />};<br />原创 2011-03-02 20:58:00 · 5349 阅读 · 0 评论 -
localtime 和 localtime_r
上程序:#include #include #include #include using namespace std;int main(int argc, char *argv[]){ time_t tNow =time(NULL); time_t tEnd = tNow + 1800; struct tm* ptm = localtime(&tNow); struct tm* ptmEnd = localtime(&tEnd); char szTmp[50] = {0};原创 2011-03-03 21:16:00 · 70482 阅读 · 6 评论 -
数组中元素顺序的安排
今天写了一组数组,需要经常搜索。假设有结构体struct player_info { uint32_t id; uint32_t lv; ...};player_info players[10]; 有5个players的搜索频率比另五个高多了,所以要有心把那5个安排在数组的前面,这要减少搜索的次数我们也可以使用sort、binary_search之类的标准函数库http:/原创 2010-04-29 10:18:00 · 582 阅读 · 0 评论 -
关于sort、binary_search
今天在使用数组的时候,亲身体验了一把sort、binary_search,以前只是在用map、set之类的时候才用到。假设有结构体struct player_info { uint32_t id; uint32_t lv; ...};player_info players[10];想对players按id进行排序,并且用二分法进行搜索。sort有两种方法:template void原创 2010-04-29 10:14:00 · 1106 阅读 · 0 评论 -
C++中动态内存分配引发问题的解决方案
原文地址:http://www.yesky.com/285/1866785.shtml假设我们要开发一个String类,它可以方便地处理字符串数据。我们可以在类中声明一个数组,考虑到有时候字符串极长,我们可以把数组大小设为200,但一般的情况下又不需要这么多的空间,这样是浪费了内存。对了,我们可以使用new操作符,这样是十分灵活的,但在类中就会出现许多意想不到的问题,本文就是针对这一现象而写的转载 2010-01-21 14:06:00 · 382 阅读 · 0 评论 -
细说 #pragma pack(n)
在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。例如,下面的结构各成员空间分配情况:struct t转载 2010-01-29 10:45:00 · 401 阅读 · 0 评论 -
ntohs, ntohl, htons,htonl inet_aton等详解
http://www.ijiyu.com/archives/348 ntohs =net to host short int 16位 htons=host to net short int 16位 ntohl =net to host long int 32位 htonl=host to net long int 32位 ntohs 简述:将一个无符号短整形数从转载 2010-03-02 14:04:00 · 1161 阅读 · 0 评论 -
STL中map的成员函数insert的返回值
http://hi.baidu.com/tiger_tnt/blog/item/3e6be9b5609ddcca36d3caa9.html map在进行插入的时候是不允许有重复的键值的,如果新插入的键值与原有的键值重复则插入无效,可以通过insert的返回值来判断是否成功插入。下面是insert的函数原型: pair insert(const value_type&转载 2010-03-18 09:48:00 · 12792 阅读 · 0 评论 -
c++中的explicit关键字
http://www.azure.com.cn/article.asp?id=335 c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?如果c++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class转载 2010-04-07 10:18:00 · 464 阅读 · 0 评论 -
图文例解C++类的多重继承与虚拟继承
http://pcedu.pconline.com.cn/empolder/gj/c/0503/579115.html 在过去的学习中,我们始终接触的单个类的继承,但是在现实生活中,一些新事物往往会拥有两个或者两个以上事物的属性,为了解决这个问题,C++引入了多重继承的概念,C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承。 举个例子,交通工具类可以派生出汽车和船连转载 2010-04-07 14:21:00 · 546 阅读 · 0 评论 -
绝对不要重新定义继承而来的缺省参数
http://www.azure.com.cn/article.asp?id=342 看下面这个例子: class CBase{public:virtual void Test(int iTest = 0) const = 0;};class CDerived : public CBase{public:void Test(int iTest = 1) const { cout转载 2010-04-07 14:32:00 · 454 阅读 · 0 评论 -
一个通用的单体模板
原文地址:http://www.azure.com.cn/article.asp?id=206 #include template class Singleton{ static T* ms_Singleton;public: Singleton( void ) { assert( !ms_Singleton); int offset = (int)(T*)1 - (i转载 2010-04-07 15:11:00 · 668 阅读 · 0 评论 -
using关键字
using关键字 1、using声明与using指示符:前者是声明某名字空间内的一个成员,后者是使用整个名字空间。例如: 代码: using std::map; // ok,using声明 using namespace std; //ok,using指示符 2、该using指示符语句可以加在程序文件的几乎任何地方,包括原创 2010-04-09 11:34:00 · 1203 阅读 · 1 评论 -
new的深入分析
“new”是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结。new的过程当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。假如我们定义了如下一个类A:class A转载 2010-04-08 14:10:00 · 575 阅读 · 0 评论 -
const 函数
用const 修饰函数的返回值如果给以“指针传递”方式的函数返回值加const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。例如函数const char * GetString(void);如下语句将出现编译错误:char *str = GetString();正确的用法是const char *str = GetString();如果函数返回转载 2010-04-09 16:21:00 · 1792 阅读 · 0 评论 -
调试小技巧--define
案例一:#includeiostream>using namespace std;#define DEBUGint factorial(int num){ if(num == 0) return 1; else { # if defined(DEBUG) static i; printf("%d"原创 2010-04-23 17:56:00 · 680 阅读 · 0 评论 -
linux进程间内存共享---mmap
系统调用mmap()用于共享内存的两种方式:(1)使用普通文件提供的内存映射:适用于任何进程之间; 此时,需要打开或创建一个文件,然后再调用mmap();典型调用代码如下: fd=open(name, flag, mode); if(fd ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP原创 2011-10-27 23:16:54 · 1359 阅读 · 0 评论