没有被调用的构造函数和“未被分配的指针”错误

时间:2016-11-29 05:42:30

标签: c++ pointers constructor

我开始学习C ++了。这些概念很难,因为我之前没有任何面向对象的编程经验。我正在学习内置数组和构造函数/析构函数,我遇到了一个错误,我无法解决这个问题。在这里,我将向你们展示代码。

类定义

class arraysClass{

public:

    int size1;
    int size2;

    int **frequencies;

    arraysClass(int size1, int size2){
        cout << "Constructor: size1&size2 " << size1 << " " << size2 << endl;
        frequencies = new int*[size1+1];
        for (int i=0; i<=size1; i++){
            frequencies[i] = new int[size2+1];
        }
    }

    //Destructor
    ~arraysClass()
    {
        cout << "Destructor: size1&size2 " << size1 << " " << size2 << endl;
        for (int i=0; i<=size1; i++){
            delete [] frequencies[i];
        }
        delete [] frequencies;

    }
};

这是我的主要功能

int main()
{
    int size1 = 20;
    int size2 = 30;
    arraysClass arrays1(size1, size2);

    arraysClass arrays2 = arrays1;

    arrays2.size1 = size1;
    arrays2.size2 = size2;

    return 1;
}

我得到的结果是

  

构造函数:size1&amp; size2 20 30

     

析构函数:size1&amp; size2 20 30

     

析构函数:size1&amp; size2 0 0

     

a.out(41138,0x7fff75694000)malloc:***对象0x7fa2eac032d0错误:未释放指针

奇怪的是,当我的类对象有第二个实例时,构造函数只被调用一次。我没有制作任何拷贝构造函数或重载了operator =函数,所以我不确定如何处理这种情况。

有人关心帮助一个绝望的大学生吗?谢谢!

1 个答案:

答案 0 :(得分:2)

arraysClass arrays2 = arrays1;此处调用了默认的复制构造函数,并将成员int **frequencies复制到arrays2。捕获是 - 这就是所谓的浅拷贝,即只复制指针值,两个指针指向同一个内存。

main函数结束时,arrays1arrays2都被销毁,而在析构函数中,int **frequencies(记住,它们指向同一位置)被删除了两次。所以,第一个删除正常,第二个是崩溃程序,因为删除已删除的指针是未定义的行为。

此处的正确修复是在复制构造函数中进行深层复制并重载operator=。 复制构造函数的示例:

arraysClass(const arraysClass& rhs) {
    cout << "Copy Constructor" << endl;
    size1 = rhs.size1;
    size2 = rhs.size2;
    frequencies = new int*[size1+1];
    for (int i=0; i<=size1; i++){
        frequencies[i] = new int[size2 + 1];
        memcpy(frequencies[i], rhs.frequencies[i], rhs.size2 + 1)
    }
}