未调用构造函数和;未分配要释放的指针";错误 我已经开始学习C++了。这些概念很难理解,因为我以前没有任何面向对象编程经验。我正在学习内置数组和构造函数/析构函数,我遇到了一个无法理解的错误。这里,我给你们看代码

未调用构造函数和;未分配要释放的指针";错误 我已经开始学习C++了。这些概念很难理解,因为我以前没有任何面向对象编程经验。我正在学习内置数组和构造函数/析构函数,我遇到了一个无法理解的错误。这里,我给你们看代码,c++,pointers,constructor,C++,Pointers,Constructor,类的定义是 class arraysClass{ public: int size1; int size2; int **frequencies; arraysClass(int size1, int size2){ cout << "Constructor: size1&size2 " << size1 << " " << size2 <

类的定义是

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;

    }
};
我得到的结果是

建造商:尺寸1和尺寸2 20 30

析构函数:大小1和大小2 20 30

析构函数:大小1和大小2 0 0

a、 out(41138,0x7fff75694000)malloc:**对象0x7fa2eac032d0的错误:未分配要释放的指针

奇怪的是,构造函数只被调用了一次,而我的类对象显然还有第二个实例。我没有创建任何复制构造函数或重载operator=函数,因此我不确定如何处理这种情况


有人愿意帮助一个绝望的大学生吗?谢谢

arraysClass-arrays2=arrays1int**frequencies
复制到
arrays2
。捕获是-这就是所谓的浅层复制,即只复制指针值,并且两个指针指向同一内存

main
函数的末尾,
arrays1
arrays2
都被销毁,而在析构函数中,
int**frequencies
(记住,它们指向同一位置)被删除两次。所以,第一次删除进行得很顺利,第二次是程序崩溃,因为删除已经删除的指针是未定义的行为

正确的解决方法是在复制构造函数中进行深度复制,并重载
操作符=
。 复制构造函数的示例:

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)
    }
}
arraysClass(常量arraysClass&rhs){

cout隐式复制构造函数被调用,第二个实例再次尝试删除复制的指针。还有你的
new int*[size1+1]
with
for…i@πάνταῥεῖ 谢谢你的引导。我在这个主题上做了一些谷歌搜索,但对复制构造函数的工作方式仍然很模糊。那么这是否意味着
arrays1
arrays2
都指向同一个对象?隐式复制构造函数对用户定义的类应该这样做吗?我想这可以解释为什么我会得到这样一个错误消息G.C++有一个非正式的规则,叫做三的规则:如果你需要三个特殊成员中的任何一个{拷贝构造函数、赋值、析构函数},那么你可能需要所有三个。你可能还想实现一个移动,但这是性能优化。哇,这正好回答了我的问题。谢谢!
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)
    }
}