C++默认析构函数

《数据结构与算法分析C++描述》中说,“假设类仅包含一个指针数据成员,并且这个指针指向一个动态分配地址的对象。默认析构函数不对指针进行任何操作(一个好的理由就是释放这个指... 《数据结构与算法分析C++描述》中说,
“假设类仅包含一个指针数据成员,并且这个指针指向一个动态分配地址的对象。默认析构函数不对指针进行任何操作(一个好的理由就是释放这个指针就必须删除自身)。”
括号中好的理由是什么意思?必须删除自身是?
展开
 我来答
longxpzhh
2013-01-15 · 超过17用户采纳过TA的回答
知道答主
回答量:75
采纳率:0%
帮助的人:46.5万
展开全部
好的理由是指给析构函数不对指针进行操作的一个好的解释
默认析构函数对成员操作时直接删除,因为new或者malloc出来的内存必须要delete或者free,如果不经过这个操作而直接删除指针的话就会造成内存溢出。要定义~m_Class(){delete p;}
析构函数如果默认对指针进行释放的话又会导致一个问题,编译器并不能确定这个指针成员指向的内容是什么,假如有其他指针p也指向这一块动态分配的内存,那么析构函数释放内存的操作会造成p变成悬垂指针,所以这时候就不能直接delete
所以在c++中需要用户自己进行指针成员的析构操作。而上面那个例子的解决方法就是使用智能指针,相关知识自己去查吧
拥云庄主
2013-01-15 · TA获得超过2505个赞
知道小有建树答主
回答量:672
采纳率:100%
帮助的人:424万
展开全部
通常情况下,如果一个类包含有指针数据成员,我们在复制对象时,不能直接对指针进行赋值,而应该是重新动态分配内存,并复制指针所指向数据,称之为深拷贝,否则,一旦析构函数去释放指针时,会造成内存的重复释放,导致程序崩溃。书上这里说默认析构不对指针做任何操作,个人执保留意见,因为一般调用析构函数时,就表示这个对象已经消亡了,所以,由析构函数一进行一些收尾工作,包含释放动态分配的内存。但需要注意的就是上面提到的,当类有指针型数据变量时,复制对象的时候要深拷贝,不要浅拷贝。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ansenyou
2013-01-15 · TA获得超过2.4万个赞
知道大有可为答主
回答量:1.1万
采纳率:8%
帮助的人:7964万
展开全部
class a
{
public:
a():m_pData(NULL){m_pData= new char[50];}
virtual ~a(){delete []m_pData; //delete NULL is okay}
private:
char* m_pData;
}

....
a* pA = new a;
在你 new a 对象的时候,实际上你向系统申请char[50] 个字节
如果, ~a()内不delete,那么m_pData的内存是在什么时候被释放的呢?
括号中好的理由是:指针通过 new 或 new[] ,向系统“申请”得到一段内存空间,这段内存空间必须在不需要将它释放了
删除自身应该由调用者来删除的,我估计这里说得有问题,或我理解有错。

a* pA = new a;
delete *pA;
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chujiangke001
2013-01-15 · TA获得超过1605个赞
知道小有建树答主
回答量:1352
采纳率:0%
帮助的人:694万
展开全部
就是析构函数不负责自动释放类仅包含一个指针数据成员;
要这样~exp(){ free p;}
这样~exp(){} 不会释放p指向的单元
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式