释放指针所指向的内存中存在一些坑,这里总结一下
坑点一
在释放内存之时,不仅仅是将该块内存进行释放,还要将指向该块内存的指针置为NULL。如果不置为NULL,该指针将变成悬空指针,下次继续使用该指针时会出现问题。
总之,free或者delete只是将指针指向的内存进行释放,却并没有对指针做任何操作。
坑点二:
只使用上文方法释放内存,依旧会存在以下隐患:
指针释放并值为空,如果只是简单的指针变量,几乎没有时间消耗;但是如果在类的析构函数中delete指针成员变量,可能执行的时间比较长,如果这个时间段内有其他地方再操作这个这个指针变量,将产生错误,所以需要采用防御性编程,如下所示:
// 假设m_instance是类的指针型成员变量
CServerSocket* m_instance;
if (m_instance != NULL)
{
CServerSocket* tmp = m_instance;
m_instance = NULL; // 先置为空,防止其他地方使用即将释放的指针
delete tmp; // 再释放指针所指向的内存
}