生存周期中的指针

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

举个例子:

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

 

而第二个函数就没问题。

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火云洞红孩儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值