不需要动态内存分配的话就不需要显示定义析构函数,复制构造函数,赋值操作符,为什么?

为什么动态分配就得显示的定义他们?... 为什么动态分配就得显示的定义他们? 展开
 我来答
weichang0829
2012-09-29 · TA获得超过4764个赞
知道大有可为答主
回答量:2966
采纳率:33%
帮助的人:1009万
展开全部
这个问题掌握了,你就对C++掌握六成以上了。

当类的构造函数中动态申请了内存的话,如果new 出该类的一个对象,当你delete对象的时候,只能释放掉该类中的其他成员变量,而动态申请的内存空间就无法释放了,这样就会导致内存泄露。所以在构造函数中动态申请了内存的话,那么就一定要在析构函数中用delete运算符来释放申请的内存。

另外,我们知道,如果不显示定义类的复制构造函数、赋值函数的时候,类会产生默认的复制构造函数、赋值函数,而这些默认的函数,只是一种“浅”赋值、“浅”复制。说他们“浅”,是因为他们只是简单的进行赋值和复制,而这样可能会导致这样一种问题。
比如,类的对象A里面有个指针成员变量p,指向一片动态申请的内存区域,当进行对象复制的时候,对象B里面的指针变量将会得到和A里的指针一样的地址值,即他们指向同一块区域。这时如果,对象A中指针p指向的内存空间被释放,那么对象B中的指针指向的位置也一同被释放(因为他们指向同一片内存空间),所以程序就会出错。同理赋值函数也是一样的道理。

这时就该显示的定义类的复制构造函数,赋值操作符,进行深赋值、深复制,来避免上面的问题。
更多追问追答
追问
那为什么如果不用new,直接申明的时候用char ch[40]这种类似的方法就不用显式定义了?
另外,我想问一下,这两种方法的优劣,以及如何选择什么情况下使用哪一个方法?
追答
问题的关键是:你是否在类的构造函数里动态申请了内存。而不是说你如何定义了类对象(是new出来的还是直接定义)。只要在类的构造函数里动态申请了内存,就必须显示定义析构函数,复制构造函数,赋值操作符,用来解决我上面说的问题,不管你是直接定义了类对象,还是使用new操作符动态申请的内存。
beddy1
2012-09-29 · TA获得超过1989个赞
知道大有可为答主
回答量:2271
采纳率:0%
帮助的人:2201万
展开全部
纠缠这些句子没有必要,况且这句话说的是错的。
类可以不需要动态分配,但它可以全权管理动态分配的内存,这个时候如果不定义复制构造函数,就会有问题。多个实例共同管理一个动态分配的内存,会在任一个析构时导致其它实例出错。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式