随心动

2014年3月13日

     摘要:   阅读全文
posted @ 2014-03-13 03:06 陈志远 阅读(474) | 评论 (0)编辑 收藏

2013年12月17日

转载网址:http://blog.csdn.net/windboyzsj/article/details/2790485
 1 #include <iostream.h> 
 2 class Singleton 
 3 { 
 4 public
 5 ~Singleton(){cout<<"singleton deconstruct"<<endl;} 
 6 static Singleton* Instance() 
 7 { 
 8   if (_instance == NULL) 
 9   { 
10    _instance = new Singleton(); 
11    static Cleaner cl; //延迟到这里 
12   } 
13   return _instance; 
14 } 
15 void Print(char* str) 
16 { 
17   cout<<"singleton print:"<<str<<endl; 
18 } 
19 private
20 Singleton(){cout<<"singleton construct"<<endl;} 
21 static Singleton* _instance; 
22 class Cleaner 
23 { 
24 public
25   Cleaner(){cout<<"cleaner construct"<<endl;} 
26   ~Cleaner() 
27   { 
28    cout<<"cleaner deconstruct"<<endl; 
29    if(Singleton::Instance()) 
30    delete Singleton::Instance(); 
31   } 
32 }; 
33 }; 
34 Singleton* Singleton::_instance = NULL; 
35 int main(int argc, char* argv[]) 
36 { 
37 Singleton::Instance()->Print("print 1"); 
38 Singleton::Instance()->Print("print 2"); 
39 return 0; 
40 }
posted @ 2013-12-17 04:18 陈志远 阅读(297) | 评论 (0)编辑 收藏

2013年12月16日

     摘要: 网上看到的,非常有用,转载一下, 非常感谢作者。  阅读全文
posted @ 2013-12-16 00:01 陈志远 阅读(6054) | 评论 (0)编辑 收藏

2013年12月15日

一个自处理的list 用途多多
  1
   1 //子项
  2   2 class autoItem
  3   3 {
  4   4 public:
  5   5     //处理
  6   6     virtual bool  proces() = 0;
  7   7     //弹出
  8   8     virtual bool  ok() = 0; 
  9   9     //处理顺序
 10  10     virtual int   Order(){return 0;}
 11  11 };
 12  12 enum sortType
 13  13 {
 14  14     ST_Input,
 15  15     ST_Custom
 16  16 };
 17  17 //自处理list
 18  18 class _autolist
 19  19 {
 20  20 public:
 21  21     _autolist( sortType _type );
 22  22     ~_autolist();
 23  23 
 24  24     //继承函数
 25  25 public:
 26  26     //加入处理序列
 27  27     virtual bool  push(autoItem *p);
 28  28     //执行处理序列
 29  29     virtual bool  go();
 30  30     //清理所有
 31  31     virtual bool  clear(); 
 32  32 
 33  33     //
 34  34 protected:
 35  35     std::list<autoItem*> itemList;
 36  36     sortType _sortType;
 37  37 };
 38  38 
 39  39 
 40  40 _autolist::_autolist( sortType _type )
 41  41 {
 42  42     _sortType = _type;
 43  43 }
 44  44 
 45  45 _autolist::~_autolist()
 46  46 {
 47  47     clear();
 48  48 }
 49  49 
 50  50 bool _autolist::push( autoItem *p )
 51  51 {
 52  53     if (p == NULL) return false;
 53  54     switch (_sortType)
 54  55     {
 55  56     case ST_Input:
 56  57         {
 57  58             itemList.insert(itemList.end(),p);
 58  59             return true;
 59  60         }
 60  61     case ST_Custom:
 61  62         {
 62  63             if (itemList.size() == 0)
 63  64             {
 64  65                 itemList.push_back(p);
 65  66                 return true;
 66  67             }
 67  68             static std::list<autoItem*>::iterator it;
 68  69             it= itemList.begin();
 69  70             for (; it != itemList.end();it++)
 70  71             {
 71  72                 if ((*it)->Order() < p->Order())continue;
 72  73                 itemList.insert(it,p);
 73  74                 break;
 74  75             }
 75  76             return true;
 76  77         }
 77  78     default:
 78  80         return false;
 79  82     }
 80  83     return false;
 81  84 }
 82  85 
 83  86 bool _autolist::go()
 84  87 {
 85  88     static std::list<autoItem*>::iterator it;
 86  89     int nsize = itemList.size();
 87  90     it= itemList.begin();
 88  91     for (; it != itemList.end();)
 89  92     {
 90  93         (*it)->proces();
 91  94         if ( (*it)->ok())
 92  95             it = itemList.erase(it);
 93  96         else
 94  97             it++;
 95  98     }
 96  99     return true;
 97 100 }
 98 101 
 99 102 bool _autolist::clear()
100 103 {
101 104     itemList.clear();
102 105     return true;
103 106 }
104 107 
105 
posted @ 2013-12-15 22:30 陈志远 阅读(1422) | 评论 (2)编辑 收藏

2013年4月16日

点:
   v1(x,y,z)           ->v1(x,y,-z)                      Z轴方向不同                       DX:  z正方向屏幕向里           OpengGL:  z正方向屏幕向外
面:
   face1(v1,v2,v3) -> face(v1,v3,v2)                正面相反                           DX:  面正方向是顺时针           OpengGL:  面正方向逆时针
纹理坐标
   tz(u,v)              -> tz(u,1.0f-z)                   (0,0)点不同                       DX:  (0,0)左上角                   OpengGL:  (0,0)左下角
矩阵:
   m(m00,...m33)   ->转置()                            ()                                    DX: 左手坐标系,行向量           OpenGL:  右手坐标系,列向量 
posted @ 2013-04-16 11:34 陈志远 阅读(321) | 评论 (0)编辑 收藏

2013年3月24日

     摘要: SQLite存取二进制数据(http://hi.baidu.com/ejoywx/blog/item/4d7b418c8677cc00b31bbae9.html)http://blog.sina.com.cn/s/blog_60f8483a0100ydaw.html Code highlighting produced by Actipro CodeHighlighter (freeware)h...  阅读全文
posted @ 2013-03-24 16:06 陈志远 阅读(9513) | 评论 (1)编辑 收藏

2012年7月27日

VC++ IDE 的默认状态(VC6)是没有启用内存泄漏检测机制的,也就是说即使某段代码有内存泄漏,调试会话的 Output 窗口的 Debug 页不会输出有关内存泄漏信息。你必须设定以启用内存泄漏检测机制。


 
按下面的方法使用调试堆函数
在XXXView.cpp中添加下面粗体行

你再看看输出结果,是不是有很多的内存泄漏?

#define _CRTDBG_MAP_ALLOC
#include<stdlib.h>
#include<crtdbg.h>


CXXXView::~CXXXView()
{
     _CrtDumpMemoryLeaks();
}

文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppjs/2007925/73624.html)

       首先,应该是MFC报告我们发现内存泄漏。注意:要多运行几次,以确定输出的内容不变,特别是{}之间的数值,不能变,否则下面的方法就不好用了。
image001.jpg

        我们来看看:

F:\CodeSample\Test\TestPipe\LeakTest\MainFrm.cpp( 54 { 86 normal block at  0x00422E80 10  bytes  long .
 Data: 
<            >  1F 1F 1F 1F 1F CD CD CD CD CD 


         F:\CodeSample\Test\TestPipe\LeakTest\MainFrm.cpp(54) 告诉我们MFC认为是在该文件的54行,发生了内存泄漏。你双击改行就可以转到该文件的54行了。但是有时候这一信息并不能用来准确判断,比如:MFC可能报告Strcore.cpp文件的某行,实际上这是CString的实现函数,此时并不知道什么时候发生了内存泄漏。

         此时我们需要更多的信息。那么我们看看紧接其后的:

{ 86 normal block at  0x00422E80 10  bytes  long .
 Data: 
<            >  1F 1F 1F 1F 1F CD CD CD CD CD 


         它告诉我们:在第86次分配的内存没有释放,一共有10字节,内容移16进制方式打印给我们看。

         有了这些信息,我们可以开始调试内存泄漏了。

         按下F10在程序的刚开始处,停下来,打开Watch窗口:

image002.jpg

         在Watch窗口中输入:

{,,msvcrtd.dll}_crtBreakAlloc


  image003.jpg

         然后更改值为上文提到的分配次数:86

image004.jpg

         接着按下F5继续,然后在第86次分配的时候会发生中断:

image005.jpg

         然后我们打开堆栈窗口:

image006.jpgimage007.jpg

      往回查看最近我们自己的代码,双击堆栈我们自己的函数那一层,上图有绿色三角的那一层。就定位到泄漏时分配的内存了。

image008.jpg

         之后,就是看你的编码功底了。




 

你也许还没用过的vc++的调试的功能

From: http://www.cnitblog.com/Raistlin/archive/2005/12/14/5380.html

刚刚在IT博客网闲逛的时候看到了孤独的夜的一片文章《如何调试MFC中的内存泄漏》,讲道用设置{,,msvcrtd.dll}_crtBreakAlloc这个变量来调试内存泄露的问题。

How to use _crtBreakAlloc to debug a memory allocation你可以找到英文的更完整的版本,静态链接和动态连接到C运行库的名称是不一样的
静态:_crtBreakAlloc
动态:{,,msvcr40d.dll}*__p__crtBreakAlloc()  (vc++4.0 和4.1版本,估计没人在用吧)
         {,,msvcrtd.dll}*__p__crtBreakAlloc()  (Visual C++ 4.2 or later)
         {,,msvcrtd.dll}_crtBreakAlloc (好像这样也是可以的)


{,,msvcrtd.dll}__p__crtBreakAlloc()是个什么东西呢?

查看msdn索引“Advanced Breakpoint”and you will find out...

语法如下:
{[function],[source],[exe] } location
{[function],[source],[exe] } variable_name
{[function],[source],[exe] } expression_r_r
这个是我转的时候的地址:http://blog.sina.com.cn/s/blog_630d564a0100gq5k.html

posted @ 2012-07-27 19:20 陈志远 阅读(414) | 评论 (0)编辑 收藏

2012年7月17日

原文地址:http://blog.csdn.net/liuchanghe/article/details/1425080

http://blog.vckbase.com/smileonce/articles/1184.html
(这个链接->关于Debug和Release之本质区别

今天公司有同事问我ASSERT与VERIFY宏有什么区别,虽然平时常用这两个宏对一些变量在Debug模式下作判断,但一时还真答不上来二者之间的具体差别,看来只是知其然不知其所以然。后来查了一些资料,总算弄清楚了二者之间的区别,整理后与同事交流了一番,感觉收获还是蛮大的。下面对我的理解进行了总结:

    1 ASSERT与VERIFY宏在Debug模式下作用基本一致,二者都对表达式的值进行计算,如果值为非0,则什么事也不做;如果值为0,则输出诊断信息。
    2 ASSERT与VERIFY宏在Release模式下效果完全不一样。ASSERT不计算表达式的值,也不会输出诊断信息;VERIFY计算表达式的值,但不管值为0还是非0都不会输出诊断信息。
VERIFY   与ASSERT用在程序调试上并无本质上的区别。  
  In   the   debug   version   of   MFC,   the   VERIFY   macro   evaluates   its   argument.   If   the   result   is   0,    
  the   macro   prints   a   diagnostic   message   and   halts   the   program.   If   the   condition   is   nonzero,    
  it   does   nothing.  
   
  In   the   release   version   of   MFC,   VERIFY   evaluates   the   expression   but   does   not   print   or   interrupt   the   program.   For   example,   if   the   expression   is   a   function   call,   the   call   will   be   made.  
断言类型  定义
ANSI C 断言 void assert(int expression );
C Runtime Lib 断言 _ASSERT( booleanExpression );
_ASSERTE( booleanExpression );
MFC 断言 ASSERT( booleanExpression );
VERIFY( booleanExpression );
ASSERT_VALID( pObject );
ASSERT_KINDOF( classname, pobject );
ATL 断言 ATLASSERT( booleanExpression );
 此外,TRACE() 宏的编译也受 _DEBUG 控制。
 所有这些断言都只在 Debug版中才被编译,而在 Release 版中被忽略。唯一的例外是 VERIFY() 。事实上,这些宏都是调用了 assert() 函数,只不过附加了一些与库有关的调试代码。如果你在这些宏中加入了任何程序代码,而不只是布尔表达式(例如赋值、能改变变量值的函数调用 等),那么 Release 版都不会执行这些操作,从而造成错误。初学者很容易犯这类错误,查找的方法也很简单,因为这些宏都已在上面列出,只要利用 VC++ 的 Find in Files 功能在工程所有文件中找到用这些宏的地方再一一检查即可。另外,有些高手可能还会加入 #ifdef _DEBUG 之类的条件编译,也要注意一下。
 顺便值得一提的是 VERIFY() 宏,这个宏允许你将程序代码放在布尔表达式里。这个宏通常用来检查 Windows API 的返回值。有些人可能为这个原因而滥用 VERIFY() ,事实上这是危险的,因为 VERIFY() 违反了断言的思想,不能使程序代码和调试代码完全分离,最终可能会带来很多麻烦。因此,专家们建议尽量少用这个宏
posted @ 2012-07-17 23:38 陈志远 阅读(438) | 评论 (0)编辑 收藏
仅列出标题  

导航

<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

常用链接

留言簿

随笔档案

文章分类

Othor's blog

搜索

最新评论

阅读排行榜

评论排行榜