现在写东西时常常在容器中放结构或类。但结构和类中常常又会放指针。在一些时候,如果不仔细考量指针此时的变化细节。可能会在运行时挂掉。
举个例子:
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 所指向的内存已经被释放。成了无效的指针。如果你在项目中使用此指针,你会挂掉的。
而第二个函数就没问题。