C++:三大函数拷贝构造、拷贝复制和析构函数详解

文章讨论了在C++中,当类含有指针成员时,为何需要自定义拷贝构造函数和拷贝赋值运算符。默认的拷贝构造和赋值操作可能导致浅拷贝,从而引起内存泄漏问题。通过String类的实现,展示了如何进行深拷贝以确保每个对象独立拥有内存,防止野指针和资源泄露。
摘要由CSDN通过智能技术生成

编译器会给出默认的拷贝构造、拷贝赋值,但针对指针会有深拷贝浅拷贝的问题,会出现内存泄漏的风险。以String类实现为例。

如果一个类中有指针成员,则必须有拷贝构造和拷贝赋值。因为编译器默认的赋值操作仅仅是浅拷贝。

class String
{
public:
	String(const char* cstr = 0);  //默认构造
	String(const String&  str);    //拷贝构造
	String& operator=(const String& str);   //操作符重载,拷贝复制
	~String();  //析构
	char* get_c_str() const { return m_data; }
private:
	char* m_data;  //因为字符串有大有小,所以用指针的方式动态分配内存
};

首先对上面BigThree来进行分析。

针对默认构造的分析,首先代码如下:

String::String(const char* cstr = 0)
{
	if (cstr)
	{
		m_data = new char[strlen(cstr) + 1];
		strcpy(m_data, cstr);
	}
	else {
        m_data = new char[1];
		*m_data = '\0';
	}
}
String::~String
{
	delete[] m_data;
}

拷贝构造:

下面代码就是进行深拷贝,浅拷贝如果是只是所有权的改变,有点像别名的意思,因为只对指针进行浅拷贝本质上都是指向一块内存。而深拷贝就是完全的重新拥有,即自己开辟内存,自己存放数据,这样可以避免野指针的出现。

String::String(const String&&& str)
{
    m_data = new char[ strlen[str.m_data) + 1 ];
    strcpy(m_data ,str.m_data);
}


{
    String s1("hello");
    String s2(s1);

}

拷贝复制

String& String::operator = (const String& str)
{
     if( this == & str)
            return *this;
     delete[] m_data;
     m_data = new char[strlen(str.m_data)+1];
     strcpy(m_data,str.m_data);
     return *this;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值