C++默认析构函数
《数据结构与算法分析C++描述》中说,“假设类仅包含一个指针数据成员,并且这个指针指向一个动态分配地址的对象。默认析构函数不对指针进行任何操作(一个好的理由就是释放这个指...
《数据结构与算法分析C++描述》中说,
“假设类仅包含一个指针数据成员,并且这个指针指向一个动态分配地址的对象。默认析构函数不对指针进行任何操作(一个好的理由就是释放这个指针就必须删除自身)。”
括号中好的理由是什么意思?必须删除自身是? 展开
“假设类仅包含一个指针数据成员,并且这个指针指向一个动态分配地址的对象。默认析构函数不对指针进行任何操作(一个好的理由就是释放这个指针就必须删除自身)。”
括号中好的理由是什么意思?必须删除自身是? 展开
4个回答
展开全部
好的理由是指给析构函数不对指针进行操作的一个好的解释
默认析构函数对成员操作时直接删除,因为new或者malloc出来的内存必须要delete或者free,如果不经过这个操作而直接删除指针的话就会造成内存溢出。要定义~m_Class(){delete p;}
析构函数如果默认对指针进行释放的话又会导致一个问题,编译器并不能确定这个指针成员指向的内容是什么,假如有其他指针p也指向这一块动态分配的内存,那么析构函数释放内存的操作会造成p变成悬垂指针,所以这时候就不能直接delete
所以在c++中需要用户自己进行指针成员的析构操作。而上面那个例子的解决方法就是使用智能指针,相关知识自己去查吧
默认析构函数对成员操作时直接删除,因为new或者malloc出来的内存必须要delete或者free,如果不经过这个操作而直接删除指针的话就会造成内存溢出。要定义~m_Class(){delete p;}
析构函数如果默认对指针进行释放的话又会导致一个问题,编译器并不能确定这个指针成员指向的内容是什么,假如有其他指针p也指向这一块动态分配的内存,那么析构函数释放内存的操作会造成p变成悬垂指针,所以这时候就不能直接delete
所以在c++中需要用户自己进行指针成员的析构操作。而上面那个例子的解决方法就是使用智能指针,相关知识自己去查吧
展开全部
通常情况下,如果一个类包含有指针数据成员,我们在复制对象时,不能直接对指针进行赋值,而应该是重新动态分配内存,并复制指针所指向数据,称之为深拷贝,否则,一旦析构函数去释放指针时,会造成内存的重复释放,导致程序崩溃。书上这里说默认析构不对指针做任何操作,个人执保留意见,因为一般调用析构函数时,就表示这个对象已经消亡了,所以,由析构函数一进行一些收尾工作,包含释放动态分配的内存。但需要注意的就是上面提到的,当类有指针型数据变量时,复制对象的时候要深拷贝,不要浅拷贝。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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;
{
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;
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
就是析构函数不负责自动释放类仅包含一个指针数据成员;
要这样~exp(){ free p;}
这样~exp(){} 不会释放p指向的单元
要这样~exp(){ free p;}
这样~exp(){} 不会释放p指向的单元
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询