C++类对象的异常赋值
Posted LC编程开发者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++类对象的异常赋值相关的知识,希望对你有一定的参考价值。
学习了对象赋值的操作,我们知道对象的赋值,就是对象之间的成员变量一一对应赋值。如果对象成员变量有定义指针,那么,就容易出现内存异常。下面是一个程序测试代码,看看对象赋值导致的内存异常。
程序运行结果如下:
可以看到,定义了stud, stud1对象,执行stud1 = stud;操作,把stud对象赋值给stud1对象,然后,输出stud1对象的数据。却没有看到stud1正常的数据,为什么?
定义的student类有name, addr成员,该成员是一个指针变量。然后,在构造函数中给该指针申请内存,然后,拷贝数据。最后,销毁对象的时候,在类的析构函数中,释放申请到的内存块。
所以,问题就出在析构函数的“释放内存块”中。因为,执行 stud1 = stud;操作的时候,对象之间的成员变量相互赋值,有:
stud1.name = stud.name;
stud1.addr = stud.addr;
stud1.number = stud.number;
所以,stud1.name和stud.name指向同一块内存,stud1.addr和stud.addr指向同一块内存。那么,stud是在if语句块中定义的局部对象,当退出if语句块的时候,stud对象销毁,所以,调用stud对象的析构函数。
那么,在stud对象的析构函数中,释放了stud.name, stud.addr指针指向的内存块。
由于,stud1.name和stud.name的值相同,都是指向同一块内存地址。所以,stud.name指向的内存地址被释放之后,stud1.name指针的地址值也就无效。
所以,最后调用stud1.print()函数输出stud1对象的成员变量时,输出stud1.name, stud1.addr成员变量是空的数,因为,stud1.name, stud1.addr指针指向的内存块,已经被释放
了。
那么,当对象的成员变量涉及到“指针”的时候,对象之间的赋值问题,应该怎么样操作,才可以安全赋值?
下面我们学习“赋值运算符重载”的操作,对指针类型的成员变量进行特殊操作,避免指针异常的问题。
韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip
以上是关于C++类对象的异常赋值的主要内容,如果未能解决你的问题,请参考以下文章