变量和内存

来源:互联网 发布:npm安装淘宝镜像 编辑:程序博客网 时间:2024/05/22 03:51

    写程序,发现要把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了很多次的。


当然,这些,只是我自己的理解,可能有偏差。

        

     

0 0
原创粉丝点击