问题1:临时对象的常见创造情况。
1.以值类型给函数传参。 2.类型转换。 3.函数需要返回对象时。
浅拷贝下的问题:
MyStack(const MyStack& s) //整型栈的缺省浅拷贝构造函数
{
data=s.data;
_capacity=s._capacity;
_top=s._top;
}
void fun(MyStack st)
{
int x=st.Top();
cout<<x<<endl;
}
int main()
{
MyStack sta;
sta.Push(12);
sta.Push(23);
fun(sta);
MyStack stb(sta); //浅拷贝后对于整型栈这种类型的对象,会导致同一//空间的重复拷贝,最终导致在析构时,空间被重复释放导致的错误
return 0;
}
深拷贝:
MyStack(const MyStack& s)
{
_capacity=s._capacity;
top=s.top;
_data=new int[capacity]; //新申请堆空间
memmove(_data,s_data,sizeof(int)*s.Size()); //将s_data中的数据拷贝
//到新的堆区空间中
}
int main()
{
MyStack sta1;
sta1.Push(12);
sta1.Push(11);
MyStack stb(sta1); //使用深拷贝
}
总结:当涉及到空间的问题时,在拷贝构造对象时,必须采用深拷贝,重新申请空间,然后将参数对象的空间的数据复制,这样构造完成后,析构函数就不会对同一空间持续析构释放。