C++中浅拷贝和深拷贝问题的出现以及解决方案

//浅拷贝和深拷贝 
#include<iostream>
#include<cstring>
using namespace std;
class name
{
    private:
        char *p;
        public:
            name(const char *name1)
            {
                p=new char[sizeof(name1)+1];
                strcpy(p,name1);
            }
            //解决方案:自己 手动 构建一个拷贝赋值函数,使用深拷贝 
            name(const name& obj1)
            {
                p=new char[sizeof(name)+1];
                strcpy(p,obj1.p );
             } 
            void print()
            {
                cout<<p<<endl;
            }
            ~name()
            {
                delete [] p;
            }
            protected:
};
//浅拷贝出现的原因:  
void objectsmain()
{
    name obj1("abcde");
    name obj2=obj1;//默认的拷贝构造函数 C++编译器给我们提供的
                    /*但是C++编译器在偷懒,只是把变量的值,指针变量的值拷贝到obj2的内存里面
                     而不是把指针变量所指向的内存空间又重新开辟内存,导致obj1中的指针变量和obj2
                     所指向的内存空间指向同一个地址
                     析构的时候应该先析构obj2的内存空间,然后析构obj1的内存空间,因为obj1和obj2的指针
                     指向的是同一个内存空间,而obj2所指向的内存空间已经被析构掉了,导致再一次析构obj1
                     的内存空间的时候出现没有空间要析构,就会导致编译错误。在C++中。*/ 
    name obj3=("asf");
    obj3=obj1//本来obj3和obj1指向 的内存空间不一样,但是经过这个等号赋值,导致obj3和obj1指向的空间又一样,
             // 如果没有手工的拷贝构造函数的话, 在析构的时候又会出现同一内存空间被重复析构的问题,,所以说
             //默认的等号操作符也是浅拷贝操作!!!! 
    obj1.print() ;
}
/*浅拷贝的解决方法:、
C++提供的拷贝构造函数会出现浅拷贝的问题,在必要的时候必须手工编写拷贝构造函数 */
int main()
{

    objectsmain();
    cout<<"hello"<<endl;
    return 0;
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值