浅拷贝与深拷贝的区别
6个回答
展开全部
简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!
我列举一个例子来说吧:
你正在编写C++程序中有时用到,操作符的重载。最能体现深层拷贝与浅层拷贝的,就是‘=’的重载。
看下面一个简单的程序:
class string
{
char *m_str;
public:
string(char *s)
{
m_str=s;
}
string()
{};
String & operator=(const string s)
{
m_str=s.m_str;
return *this
}
};
int main()
{
string s1("abc"),s2;
s2=s1;
cout<<s2.m_str;
}
上面的 =重载其是就是实现了浅拷贝原因。是由于对象之中含有指针数据类型.s1,s2恰好指向同一各内存。所以是浅拷贝。而你如果修改一下原来的程序:
string&operator=(const string&s)
{
if(strlen(m_str)!=strlen(s.m_str))
m_str=new char[strlen(s.m_str)+1];
if(*this!=s)
strcopy(m_str,s.m_str);
return *this;
}
这样你就实现了深拷贝,原因是你为被赋值对象申请了一个新的内存所以就是深拷贝。
我列举一个例子来说吧:
你正在编写C++程序中有时用到,操作符的重载。最能体现深层拷贝与浅层拷贝的,就是‘=’的重载。
看下面一个简单的程序:
class string
{
char *m_str;
public:
string(char *s)
{
m_str=s;
}
string()
{};
String & operator=(const string s)
{
m_str=s.m_str;
return *this
}
};
int main()
{
string s1("abc"),s2;
s2=s1;
cout<<s2.m_str;
}
上面的 =重载其是就是实现了浅拷贝原因。是由于对象之中含有指针数据类型.s1,s2恰好指向同一各内存。所以是浅拷贝。而你如果修改一下原来的程序:
string&operator=(const string&s)
{
if(strlen(m_str)!=strlen(s.m_str))
m_str=new char[strlen(s.m_str)+1];
if(*this!=s)
strcopy(m_str,s.m_str);
return *this;
}
这样你就实现了深拷贝,原因是你为被赋值对象申请了一个新的内存所以就是深拷贝。
展开全部
浅拷贝 只拷贝指针,深拷贝就是拷贝他的值,重新生成的对像。就像是浅拷贝就是你的影子,深拷贝是你的克隆人,你没了影子也就没了,但是克隆人还活着。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
浅拷贝:基本数据类型为值传递,对象类型为引用传递,
深拷贝:对于对象或者数值,所有元素或者属性均完全复制,与原对象脱离
深拷贝:对于对象或者数值,所有元素或者属性均完全复制,与原对象脱离
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在Java中,
浅复制仅仅复制所考虑的对象,而不复制他所引用的对象;
深复制把复制对象所引用的对象都复制了。
浅复制仅仅复制所考虑的对象,而不复制他所引用的对象;
深复制把复制对象所引用的对象都复制了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1、浅拷贝:默认的拷贝就是浅拷贝。仅仅拷贝的是个指针,没有开辟新的空间,拷贝出来的新指针指向原来的空间。
2、深拷贝:自己写的拷贝,自己申请了动态内存空间,用了new 或 malloc 。不但拷贝了指针,而且开辟了新的内存空间和原来的空间一样。
3、用深拷贝的话,最好用自己写的析构,释放掉(free或者delete)内存空间,也可以用默认析构。
4.用浅拷贝(即默认隐藏的拷贝),最好用默认析构,若用自己写的析构里面 ,记得不要释放内存,不然会造成重复释放内存而报错。
总结:
深拷贝: 全拷贝 既拷贝了指针和又拷贝了空间 析构时记得每次要free 和 delete
浅拷贝:指针拷贝 仅仅拷贝了指针指向原来的空间 析构时不要free 和 delete
2、深拷贝:自己写的拷贝,自己申请了动态内存空间,用了new 或 malloc 。不但拷贝了指针,而且开辟了新的内存空间和原来的空间一样。
3、用深拷贝的话,最好用自己写的析构,释放掉(free或者delete)内存空间,也可以用默认析构。
4.用浅拷贝(即默认隐藏的拷贝),最好用默认析构,若用自己写的析构里面 ,记得不要释放内存,不然会造成重复释放内存而报错。
总结:
深拷贝: 全拷贝 既拷贝了指针和又拷贝了空间 析构时记得每次要free 和 delete
浅拷贝:指针拷贝 仅仅拷贝了指针指向原来的空间 析构时不要free 和 delete
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询