用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
honghaier的公告
本人:7年游戏开发工作经验,对2D,3D网络游戏客户端,服务器技术均有现当经验。也曾在著名游戏公司任职。 开设游编程教学。 课程: 1. C++程序设计 2. WINDOWS程序设计 3. MFC工具编程 4. Direct3D进行2D编程. 5. Direct3D编程 6. HLSL教学 7. WINDOWS网络编程 8. 游戏算法基础 QQ:285421210
文章分类
存档

原创  生存周期中的指针 收藏

现在写东西时常常在容器中放结构或类。但结构和类中常常又会放指针。在一些时候,如果不仔细考量指针此时的变化细节。可能会在运行时挂掉。

举个例子:

class  A

{

       int*   m_pIntPtr;

public:

       A()

       {

             m_pIntPtr = NULL;

       }

       ~A()

        { 

               if(m_pIntPtr)

               {

                      delete m_pIntPtr;

               }

               m_pIntPtr = NULL;

         }

        

        void SetValue(int   vIntValue)

        {

               m_pIntPtr = new int;

              *m_pIntPtr = vIntValue;

        }
}

;

假设有这样一个Vector

vector<A>      Avec;

我们写出一个这样的函数:

void AddInt(int vInt)

{

        A   tA;

        tA.Set(vInt);

        Avec.push_back(tA);

}

请与下面的函数进行对比。

void AddInt(int vInt)

{

        A   tA;

        Avec.push_back(tA);

        Avec.back().Set(vInt);

}

你是否发现不同对项目的危害?

第一个函数执行完毕后。Avec多了一个项。但是其m_pIntPtr 所指向的内存已经被释放。成了无效的指针。如果你在项目中使用此指针,你会挂掉的。

而第二个函数就没问题。

发表于 @ 2009年05月01日 14:39:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:修改OGRE中的模型顶点色 | 新一篇:3D拼合地形中的浪花

  • 发表评论
  • 评论内容:
  •  
Copyright © honghaier
Powered by CSDN Blog