c++的深拷贝和浅拷贝

c++的类的默认拷贝构造函数执行的是浅拷贝,在类的成员变量是在栈上建立时,这种默认浅拷贝机制是没有问题的,但是如果类的成员变量是在堆上建立时,这就会导致重复析构同一内存空间的错误,因为默认的浅拷贝只是对地址进行拷贝,而没有重新分配内存,完成内容的拷贝,即深拷贝。
下面实现一个自己的string类(使用默认拷贝构造函数)

#include <iostream>
#include <string.h>

using namespace std;

//实现自己的string类
class MyString
{
public:
    MyString(char *str)
    {
        cout<<"MyString(char *str)"<<endl;
        _str=new char[strlen(str)+1];           //多申请一个字节用于存放'\0'
        strcpy(_str,str);
    }
    ~MyString()
    {
        cout<<"~MyString()"<<endl;
        delete[] _str;
    }
    void print()
    {
        cout<<_str<<endl;
    }

private:
    char *_str;
};

int main()
{
    MyString s1("c++ is the best language!");
    s1.print();
    MyString s2=s1;
    s2.print();

    return 0;
}

在linux平台下用gcc编译会出现如下的运行错误,两次free,注意在windows平台下会正确运行。
* Error in `./a.out’: double free or corruption (fasttop): 0x0000000000776030 *

在MyString类中添加自定义的拷贝构造函数,完成深拷贝

MyString(MyString &myString)
{
    _str=new char[strlen(myString._str)+1];
    strcpy(_str,myString._str);
}

程序正确输出为:
MyString(char *str)
c+++ is the best language!
MyString &myString
c+++ is the best language!
~MyString()
~MyString()
且用valgrind检测后没有内存泄漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值