【发布时间】:2011-05-21 14:18:59
【问题描述】:
class Array
{
double *mx; int mn;
public:
Array();
~Array(){delete []mx};
Array& operator-(Array& b); //first right way
Array operator -(Array b); //wrong way, but I don't understand why
};
Array::Array ()
{
mn=10;
mx=new double[mn];
}
//first, works perfectly
Array& Array::operator -(Array& b)
{
int i=0;
for(i=0;i<mn ;i++)
this->mx[i]-=b.mx[i];
return *this;
}
// here is Error
Array Array::operator -(Array b)
{
int i=0;
for(i=0;i<mn ;i++)
this->mx[i]-=b.mx[i];
}
int main() {
Array x,b;
x=x-b;
}
如果我使用第一个重载,一切正常。
但是如果我使用第二个,一切都编译得很好,但是当程序执行时,我收到很多这样的错误:
"c++ ** glibc detected *** double free or corruption"
我不知道为什么会这样。
据我所知,当我调用Array Array::operator-(Array b)时,必须复制对象并且一切都必须很好,但是有错误。
好吧,我已经读到我必须分配在内存中同一位置的对象。但我试过这样做:
Array Array::operator +(Array b)
{ Array c;
int i=0;
for(i=0;i<mn;i++)
this->mx[i]+=b.mx[i];
cout<<&this->mx<<" "<<&b.mx<<endl;
exit(0);
return c; }
我希望在内存中收到相同的地址....
答案是 0xbfb45188 0xbfb45178 为什么它们相等?
此外,当我在这里声明类的名称(A 对象)
编译器必须在堆栈中为对象提供新内存
我哪里错了?我不明白....
【问题讨论】:
-
你的问题是?来源和问题应该分开 - 在发布此类内容之前,请先查看其他一些 C++ 问题。
-
考虑复制构造,通过 const ref ....
标签: c++ memory dynamic parameters transfer