生存周期中的指针

长平狐 发布于 2012/11/19 15:12
阅读 76
收藏 0

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

举个例子:

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 所指向的内存已经被释放。成了无效的指针。如果你在项目中使用此指针,你会挂掉的。

 

而第二个函数就没问题。

 

 

 


原文链接:http://blog.csdn.net/honghaier/article/details/4141830
加载中
返回顶部
顶部