我正在设计一个包含2D数组的类。除了破坏功能外,一切似乎都没问题。我不知道为什么它会引发暴力阅读。
我试图检测发生了什么,但仍然无法解决这个问题。我需要你的帮助。谢谢。
class ClassA
{
int Num;
public:
ClassA()
{}
~ClassA(void)
{}
};
class ClassB
{
ClassA* pA;
public:
ClassB()
{}
ClassB(ClassA obj)
{
pA = new ClassA[1];
pA[0] = obj;
}
~ClassB(void)
{
delete[] pA;
}
ClassB::ClassB(ClassB& src)
{
this->~ClassB();
pA = new ClassA[1];
pA[0] = src.pA[0];
}
ClassB& ClassB::operator =(const ClassB& src)
{
if (this == &src)
return *this;
this->~ClassB();
pA = new ClassA[1];
pA[0] = src.pA[0];
return (*this);
}
};
ClassB Test5()
{
ClassA A;
ClassB B( A );
return B;
}
void Test6()
{
ClassB B;
B = Test5();
}
完成Test6功能后将抛出异常。
答案 0 :(得分:0)
摆脱明确调用析构函数的习惯。这样的行为不会重新初始化对象或其(非静态)成员 - 它在逻辑上会破坏对象,因此无法使用它。
this->~ClassB()
使任何尝试访问当前对象的非静态成员(即*this
)都会给出未定义的行为。
例如,在ClassB
ClassB::ClassB(ClassB& src)
{
this->~ClassB();
pA = new ClassA[1];
pA[0] = src.pA[0];
}
最后两个语句中pA
的访问是(隐式)this->pA
。所以他们都有不确定的行为。
在某些情况下,显式调用析构函数是合适的。但是赋值运算符和复制构造函数通常不属于这些情况。