C++拷贝函数调用中的浅拷贝与深拷贝的问题

//浅拷贝会导致程序bug,所以应当避免浅拷贝;

造成浅拷贝的原因:

在使用字符串、数组等需要间接赋值的情况时,我们利用指针,往往会导致同一内存空间有两个名称,进而导致同一内存空间最后被析构两次,因此会产生严重bug。

原因:

1.在上述情况下使用了C++编译器的默认构造函数;

2.在上述情况下使用了默认的等号操作符:

解决与问题如下:

#include<iostream>
#include<string>
using namespace std;

//浅拷贝和深拷贝的问题;
//浅拷贝:在调用拷贝函数时只是拷贝了值,没有拷贝地址;---两个对象使用同一块内存空间,先后进行析构;
//浅拷贝会造成报错,bug;------析构两次,导致地址丢失;

class Name
{
public:
	
	Name(const char *myp) {
		m_len = strlen(myp);
		m_p = (char*)malloc(m_len + 1);
		strcpy_s(m_p,m_len+1, myp);
		cout << "char is: " << m_p << endl;
	}
	//手工的编写拷贝构造函数-----深拷贝;----不使用C++编译器默认的拷贝构造函数;
	Name(const Name& obj1){//在必要的时候应当自己写构造函数;
		m_len = obj1.m_len;
		m_p = (char *)malloc(m_len + 1);
		strcpy_s(m_p, m_len+1,obj1.m_p);
	}
	
	~Name(){
		if (m_p != NULL) {
			free(m_p);
			m_p = NULL;
			m_len = 0;
		}
	}
private:
	char  *m_p;
	int   m_len;
};

void objplay() {
	Name obj1("abcdefg");

	Name obj2 = obj1;

	Name obj3("obj3");

	//obj3 = obj1;	//等号操作----C++编译器把对象1的属性拷贝给等号的属性;
	//解决这个需要重载  =   操作符;

}


int main()
{
	objplay();

	return 0;
}

猜你喜欢

转载自blog.csdn.net/XUCHEN1230/article/details/81334271