写程序,发现要把new的东东delete掉,老大确说,在整个类的析构函数中,一起delete,我却不明白,明明是局部变量,在该函数外面的另外的函数中做delet,岂不是会报错?
其实,是我一直没弄明白变量和内存的关联
并不是说在{}内的变量都是局部变量,关键是看一个变量的定义和存贮方式。
fun1(){int i = 0;}
毫无疑问,这定义了一个局部变量,编译器会为i 分配内存并将它存贮于函数栈中。
出了函数,编译器将此变量自动解析,一切OK!
而如果你采用了动态内存分配符,那么这个变量,就是一个全局变量了,而且存贮在堆中,你不清除,它将永远存在。也就是说是你一手分配了这块内存,那你怎么能指望自己作的事却要编译器来收场呢?所以需要自己delete!
由此可见,new的东东,并非局部变量,看一个变量是否是局部变量,要看他的定义和存贮方式!
另外一个问题:具体到我今天所做的程序,
for (int i =0; i < nNum; i++)
{
USER_INFO* pInfo = new USER_INFO;
rFile.Read(pInfo, sizeof(USER_INFO));
m_UserInfoVec.push_back(pInfo);
}
这里,new的东东,最终是push到向量中去了,那么在外面的类的析构函数中,如何做delete呢,单看pInfo,我最初以为是局部变量,在外面函数没法delete,现在,知道了,他不是局部变量,在其所在的函数外面,可以做析构,那么,该如何做delete呢?
这里,要看看这个变量最终的归宿是干什么了?程序可见,它push到向量了
所以,它的delete,是这样的
for (int i = 0; i < m_UserInfoVec.size(); i ++)
{
USER_INFO* pUserInfo = m_UserInfoVec[i];
if (pUserInfo)
{
delete pUserInfo;
pUserInfo = NULL;
}
}
m_UserInfoVec.clear();
这里,可以看到,deletel了多次,其实仔细想想,确实该如此,因为在它的使用当中,也是在for循环当中,new了很多次的。
当然,这些,只是我自己的理解,可能有偏差。