2个回答
展开全部
这个问题掌握了,你就对C++掌握六成以上了。
当类的构造函数中动态申请了内存的话,如果new 出该类的一个对象,当你delete对象的时候,只能释放掉该类中的其他成员变量,而动态申请的内存空间就无法释放了,这样就会导致内存泄露。所以在构造函数中动态申请了内存的话,那么就一定要在析构函数中用delete运算符来释放申请的内存。
另外,我们知道,如果不显示定义类的复制构造函数、赋值函数的时候,类会产生默认的复制构造函数、赋值函数,而这些默认的函数,只是一种“浅”赋值、“浅”复制。说他们“浅”,是因为他们只是简单的进行赋值和复制,而这样可能会导致这样一种问题。
比如,类的对象A里面有个指针成员变量p,指向一片动态申请的内存区域,当进行对象复制的时候,对象B里面的指针变量将会得到和A里的指针一样的地址值,即他们指向同一块区域。这时如果,对象A中指针p指向的内存空间被释放,那么对象B中的指针指向的位置也一同被释放(因为他们指向同一片内存空间),所以程序就会出错。同理赋值函数也是一样的道理。
这时就该显示的定义类的复制构造函数,赋值操作符,进行深赋值、深复制,来避免上面的问题。
当类的构造函数中动态申请了内存的话,如果new 出该类的一个对象,当你delete对象的时候,只能释放掉该类中的其他成员变量,而动态申请的内存空间就无法释放了,这样就会导致内存泄露。所以在构造函数中动态申请了内存的话,那么就一定要在析构函数中用delete运算符来释放申请的内存。
另外,我们知道,如果不显示定义类的复制构造函数、赋值函数的时候,类会产生默认的复制构造函数、赋值函数,而这些默认的函数,只是一种“浅”赋值、“浅”复制。说他们“浅”,是因为他们只是简单的进行赋值和复制,而这样可能会导致这样一种问题。
比如,类的对象A里面有个指针成员变量p,指向一片动态申请的内存区域,当进行对象复制的时候,对象B里面的指针变量将会得到和A里的指针一样的地址值,即他们指向同一块区域。这时如果,对象A中指针p指向的内存空间被释放,那么对象B中的指针指向的位置也一同被释放(因为他们指向同一片内存空间),所以程序就会出错。同理赋值函数也是一样的道理。
这时就该显示的定义类的复制构造函数,赋值操作符,进行深赋值、深复制,来避免上面的问题。
更多追问追答
追问
那为什么如果不用new,直接申明的时候用char ch[40]这种类似的方法就不用显式定义了?
另外,我想问一下,这两种方法的优劣,以及如何选择什么情况下使用哪一个方法?
追答
问题的关键是:你是否在类的构造函数里动态申请了内存。而不是说你如何定义了类对象(是new出来的还是直接定义)。只要在类的构造函数里动态申请了内存,就必须显示定义析构函数,复制构造函数,赋值操作符,用来解决我上面说的问题,不管你是直接定义了类对象,还是使用new操作符动态申请的内存。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询