hur.cn - 华软网

 热门搜索

求助:一般在什么情况下,定义的指针变量在类的析构函数中需要进行最后的处理?

  作者:未知    来源:网络    更新时间:2011/8/16
假如在view类得头文件中定义了一个doc的指针变量 *m_pDoc,那么在view执行文件的析构函数中需要对m_pDoc进行处理吗?
if (m_pDoc)
{
    delete m_pDoc;
    m_pDoc = NULL;
}
如果要是一些自己创建的类,如CFun类,在view的头文件中定义了一个指针变量*m_pCFun,那么在view执行文件的析构函数中需要对m_pCFun进行处理吗?
if (m_pCFun)
{
   delete m_pCFun;
   m_pCFun = NULL;
}

一般都在什么情况下,定义的哪些种类的指针变量需要在析构函数中需要进行最后的处理释放呢?

对这个认识的很模糊,望高手指点,谢谢!
---华软 网友回答---
主要是在构造函数中初始化的变量

具体的还要自己分析
---华软网友回复---
对于指针,如果你是new出来的,那么在析构函数中应该要delete。
---华软网友回复---
引用 1 楼 hezhe1008 的回复:
主要是在构造函数中初始化的变量

具体的还要自己分析


谢谢!
有什么好的分析方法吗?向在view中定义的一个doc的指针变量,需要在构造函数中m_pDoc = NULL,那么它需要在析构函数中进行:
if (m_pDoc)
{
  delete m_pDoc;
  m_pDoc = NULL;
}
这样的处理吗?
---华软网友回复---
只要是new出来的,都需要delete的,要不然会有内存泄漏的。
如果用完就delete,不一定在析构里delete。只要new的都delete就好了。
如果一直在用的话,可以在构造函数new,析构函数里delete。
---华软网友回复---
m_pDoc = NULL还用delete干嘛
---华软网友回复---
引用 2 楼 wltg2001 的回复:
对于指针,如果你是new出来的,那么在析构函数中应该要delete。

谢谢!

如果在头文件中定义了一个指针变量,如CFun *m_pTemp;又在执行文件中进行了m_pTemp = new CFun的操作,那么是不是就需要在析构函数中进行
if (m_pTemp)
{
   delete m_pTemp;
   m_pTemp = NULL;
}
这样的处理呢?
---华软网友回复---
分析的意思 是看你自己什么时候不需要这个东西了,就delete
---华软网友回复---
引用 4 楼 ta_ng 的回复:
只要是new出来的,都需要delete的,要不然会有内存泄漏的。
如果用完就delete,不一定在析构里delete。只要new的都delete就好了。
如果一直在用的话,可以在构造函数new,析构函数里delete。

谢谢!

没有在构造函数里new过,都是哪里用到哪里new
---华软网友回复---
一般析构函数就干些
if (m_pTemp)
{
  delete m_pTemp;
  m_pTemp = NULL;
}
之类的操作。

至于Doc不应该在View中释放吧,根据MFC的文档视图架构,两者之间应该只有关联关系,而没有相互创建、销毁关系才对。
---华软网友回复---
引用 5 楼 hezhe1008 的回复:
m_pDoc = NULL还用delete干嘛


这个我也不太清楚,只是看到其它的不少程序里都是这样用的
---华软网友回复---
引用 10 楼 fengbingchun 的回复:
引用 5 楼 hezhe1008 的回复:
m_pDoc = NULL还用delete干嘛


这个我也不太清楚,只是看到其它的不少程序里都是这样用的

new对应delete
m_pDoc = NULL是为了判断m_pDoc是否已经完成了初始化
---华软网友回复---
引用 9 楼 kyotrue 的回复:
一般析构函数就干些
if (m_pTemp)
{
  delete m_pTemp;
  m_pTemp = NULL;
}
之类的操作。

至于Doc不应该在View中释放吧,根据MFC的文档视图架构,两者之间应该只有关联关系,而没有相互创建、销毁关系才对。


谢谢!

---华软网友回复---
引用 11 楼 hezhe1008 的回复:
引用 10 楼 fengbingchun 的回复:
引用 5 楼 hezhe1008 的回复:
m_pDoc = NULL还用delete干嘛


这个我也不太清楚,只是看到其它的不少程序里都是这样用的

new对应delete
m_pDoc = NULL是为了判断m_pDoc是否已经完成了初始化


谢谢!
一般在构造函数中进行过m_pDoc = NULL;
---华软网友回复---
引用楼主 fengbingchun 的回复:
if (m_pDoc)
{
  delete m_pDoc;
  m_pDoc = NULL;
}

没必要这么用,直接删掉。
C++">
delete m_pDoc;
m_pDoc = NULL;

至于析构时要不要删除,就要看分析了。
一般来说在类A(不一定时构造函数)中new的内存,在A的析构函数中都是要删掉的。
而如果是将类B对象Bobj的指针赋值给Aobj的成员指针,则在A的析构函数中不该删除。

---华软网友回复---
引用 4 楼 ta_ng 的回复:
只要是new出来的,都需要delete的,要不然会有内存泄漏的。
如果用完就delete,不一定在析构里delete。只要new的都delete就好了。
如果一直在用的话,可以在构造函数new,析构函数里delete。


+1
---华软网友回复---
引用 14 楼 yuanmoren 的回复:
引用楼主 fengbingchun 的回复:
if (m_pDoc)
{
delete m_pDoc;
m_pDoc = NULL;
}

没必要这么用,直接删掉。

C/C++ code


delete m_pDoc;
m_pDoc = NULL;


至于析构时要不要删除,就要看分析了。
一般来说在类A(不一定时构造函数)中new的内存,在A的析构函数中都是……


谢谢!
---华软网友回复---
就怕重复delete,一般用引用技术Release较好
---华软网友回复---
引用 6 楼 fengbingchun 的回复:
引用 2 楼 wltg2001 的回复:
对于指针,如果你是new出来的,那么在析构函数中应该要delete。

谢谢!

如果在头文件中定义了一个指针变量,如CFun *m_pTemp;又在执行文件中进行了m_pTemp = new CFun的操作,那么是不是就需要在析构函数中进行
if (m_pTemp)
{
  delete m_pTemp;
  m_pTemp = NUL……

因为是new来的,所以一定要delete,否则会内存泄露,至于是不是一定要在析构函数中delete,那就不一定了,不过,在析构函数中作这个处理应该是很好的一个习惯。
---华软网友回复---
引用 5 楼 hezhe1008 的回复:
m_pDoc = NULL还用delete干嘛

m_pDoc=NULL和delete是两回事,不能替代的,如果只m_pDoc=NULL的话,那会产生内存泄露。
---华软网友回复---
只要记住一点就行了,就是new要对应delete。不是new出来的,就不用delete
---华软网友回复---
引用 18 楼 wltg2001 的回复:
引用 6 楼 fengbingchun 的回复:
引用 2 楼 wltg2001 的回复:
对于指针,如果你是new出来的,那么在析构函数中应该要delete。

谢谢!

如果在头文件中定义了一个指针变量,如CFun *m_pTemp;又在执行文件中进行了m_pTemp = new CFun的操作,那么是不是就需要在析构函数中进行
if (m_pTemp)
{
delete m……


谢谢!
---华软网友回复---
new和delete是成对出现的,只要你是new出来的,在用完(以后不用)都要delete掉。
---华软网友回复---
应该处理一下。
如果这个指针只在这个类对象中使用,析构的时候应该处理一下。
不应该是简单的delete,

应该先执行这个指针的清空等操作,在delete 这个对象


if(m_pfun)
{
m_pfun->CleanData();
delete m_pfun;
m_pfun = null;
}
---华软网友回复---
只要是类中的指针成员,都要处理啊,不然很可能内存泄露

析构,拷贝构造,赋值操作符,全部要重写

除非是智能指针
---华软网友回复---
引用 17 楼 shayla 的回复:
就怕重复delete,一般用引用技术Release较好


delete 后马上置0
delete 前判断非0
---华软网友回复---
谁分配的谁释放。指向别人分配的内存或对象的指针不释放。com的搞法除外。
类内部分配的资源,属于对象的一部分,在析构时需要释放。

---华软网友回复---
引用 19 楼 wltg2001 的回复:
引用 5 楼 hezhe1008 的回复:
m_pDoc = NULL还用delete干嘛

m_pDoc=NULL和delete是两回事,不能替代的,如果只m_pDoc=NULL的话,那会产生内存泄露。

不好意思 我没说清楚 我那个针针对3楼的。。
他说需要在构造函数中m_pDoc = NULL,没用new,所以我说不用delete
---华软网友回复---
最好是在构造中NEW,然后在析构中DELETE,防止出现还没有NEW就DELETE的现象
---华软网友回复---
引用 26 楼 ndy_w 的回复:
谁分配的谁释放。指向别人分配的内存或对象的指针不释放。com的搞法除外。
类内部分配的资源,属于对象的一部分,在析构时需要释放。


谢谢!
---华软网友回复---
引用 20 楼 wltg2001 的回复:
只要记住一点就行了,就是new要对应delete。不是new出来的,就不用delete

补充一句,还不能delete两次。不然会造成很悲剧的结果。比如程序崩溃
所以 m_pDoc = NULL; 就会变得很重要。
if (m_pDoc)
{
delete m_pDoc;
m_pDoc = NULL;
}
在这里判断它是否NULL,就是为了防止delete两次。 不为NULL的时候说明你没有delete过。
---华软网友回复---
你定义了一个指针变量,调用的逻辑有点乱的时候,最后的时候可以判断下是否为空,然后释放,可以防止内存泄露。
我觉得,其实都是看自己写代码的风格,如果逻辑清楚,写不写在析构函数都无所谓
---华软网友回复---
动态分配的
---华软网友回复---
引用 30 楼 zhaoxueqian1988 的回复:
引用 20 楼 wltg2001 的回复:

只要记住一点就行了,就是new要对应delete。不是new出来的,就不用delete

补充一句,还不能delete两次。不然会造成很悲剧的结果。比如程序崩溃
所以 m_pDoc = NULL; 就会变得很重要。
if (m_pDoc)
{
delete m_pDoc;
m_pDoc = NULL;
}
在这里判断它是否NULL……

谢谢!
---华软网友回复---
记得一点就行了:一般的,new和delete对应,谁new的就谁delete
---华软网友回复---
如果你是new出来的,分配了空间后,在你不用它的时候要释放它,delete,不然你重新开软件或是再实例化它的话就又分配空间里,分配多了就容易出错
---华软网友回复---
谁申请,谁释放。
---华软网友回复---
一般的说,用new分配的内存空间,就要用delete 释放,否则就会内存泄漏。
如果在一个类内,程序复杂,为了防止内存泄漏和野(无初值)指针,应该在构造函数内对这些可能分配内存的指针置0,而在delete前判断指针非0,delete后再置0。在析构函数中再逐一判断这些指针是否为0,否则delete,delete 后可免置0。
---华软网友回复---
学习了
---华软网友回复---
除了new和delete之外,还有一些GDI对象,也需要释放
---华软网友回复---
引用 37 楼 joy_zhou 的回复:
一般的说,用new分配的内存空间,就要用delete 释放,否则就会内存泄漏。
如果在一个类内,程序复杂,为了防止内存泄漏和野(无初值)指针,应该在构造函数内对这些可能分配内存的指针置0,而在delete前判断指针非0,delete后再置0。在析构函数中再逐一判断这些指针是否为0,否则delete,delete 后可免置0。

谢谢!
---华软网友回复---
引用 37 楼 joy_zhou 的回复:
一般的说,用new分配的内存空间,就要用delete 释放,否则就会内存泄漏。
如果在一个类内,程序复杂,为了防止内存泄漏和野(无初值)指针,应该在构造函数内对这些可能分配内存的指针置0,而在delete前判断指针非0,delete后再置0。在析构函数中再逐一判断这些指针是否为0,否则delete,delete 后可免置0。

谢谢!
---华软网友回复---
多检查资源问题,我就遭过好多次,程序无缘无故的就挂了
---华软网友回复---
lz可以试试auto_ptr
---华软网友回复---
至于到底该不该delete,LZ应该是比较明白了。

我想说的是,对于在类析构函数里对指针进行delete后,再对其置空,则完全是多此一举(整个对象都析构了,它的成员空不空,还有影响吗)。

而如果指针是用来标识一些数据,使用的时候是需要判断是不是空的,这个就需要有释放操作的地方,对其置空,这个是必须的。
---华软网友回复---
自己new的指针,肯定都要自己delete
---华软网友回复---
可以用智能指针啊?如auto_ptr , shared_ptr等,在您获得资源的时候,用智能指针去管理,这样就不用
担心出现异常时,产生内存泄露。而且,在虚构函数,不能抛出异常的。delete XXX;XXX = NULL,也有可能
产生异常的。如果要写,最后捕捉异常。如:try{}catch(...){NULL;}      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。