//浅拷贝会导致程序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;
}