深度探索C++对象模型之(七)
================================================
如果喜欢,请关注:JellyThink | 思想的果冻
更多原创精彩博文,尽在www.jellythink.com
还可以关注新浪微博:http://weibo.com/u/1887014677
================================================
0102030405060708091011121314151617181920212223242526272829303132333435363738#include "stdafx.h" #includeusingnamespace std; classA{public: A() { num = 10; } ~A() { } char*str; intnum;}; int main(){ A *a1 =new A; a1->str =new char[100]; // class A里面的str申请的空间 memset(a1->str, 0, 100 ); char*test = "JellyThink"; strcpy(a1->str, test); A *a2 =new A; a2 = a1; cout<<str<<endl; cout<<str<<endl; deletea1; //cout<<str<<endl; cout<<str<<endl;}如所示程序,在a1中申请的内存空间,然后建立a2对象,将a1赋值给a2时,由于进行的是浅复制,出现问题是,a1->str和a2->str指向的是同一块内存,当delete a1对象后,就出现a2->str指向的内存访问错误问题。而此时就需要进行深赋值,防止这种错误的发生,而只有正确的理解了这里的浅复制出现的时机,才能正确防止这种错误的发生,即使发生了这种错误,也能正确的找到解决问题的方法。
不会发生浅复制的场合: 1.当一个类中有一个member object,而这个member object有Copy Constructor时,就不会发生浅复制(不管这个Copy Constructor是显示声明的还是隐式合成的);2.当class继承自一个基类时,而这个基类有Copy Constructor时,就不会发生浅复制(不管这个Copy Constructor是显示声明的还是隐式合成的);
3.当class声明了一个或多个virtual function时;
4.当class派生自一个继承串链,其中有一个或多个virtual base class时。
在前两种情况下,编译器必须将member或base class的Copy Constructor调用操作安插到被合成的Copy Constructor中。
对于后两中情况下,将在《深度探索C++对象模型之(八)》中进行讲解。
2013/1/20 于东软大连
================================================
如果喜欢,请关注:JellyThink | 思想的果冻
更多原创精彩博文,尽在www.jellythink.com
还可以关注新浪微博:http://weibo.com/u/1887014677
================================================