0
点赞
收藏
分享

微信扫一扫

生存周期中的指针

耶也夜 2023-04-03 阅读 23


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

举个例子:

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

 

而第二个函数就没问题。

 

 

 

举报

相关推荐

0 条评论