删除类中的2D数组时出错

时间:2015-11-08 05:12:55

标签: c++

我正在设计一个包含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功能后将抛出异常。

1 个答案:

答案 0 :(得分:0)

摆脱明确调用析构函数的习惯。这样的行为不会重新初始化对象或其(非静态)成员 - 它在逻辑上会破坏对象,因此无法使用它。

this->~ClassB()使任何尝试访问当前对象的非静态成员(即*this)都会给出未定义的行为。

例如,在ClassB

的复制构造函数中
ClassB::ClassB(ClassB& src)
{
    this->~ClassB();

    pA = new ClassA[1];
    pA[0] = src.pA[0];
}

最后两个语句中pA的访问是(隐式)this->pA。所以他们都有不确定的行为。

在某些情况下,显式调用析构函数是合适的。但是赋值运算符和复制构造函数通常不属于这些情况。