我开始学习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 =函数,所以我不确定如何处理这种情况。
有人关心帮助一个绝望的大学生吗?谢谢!
答案 0 :(得分:2)
arraysClass arrays2 = arrays1;
此处调用了默认的复制构造函数,并将成员int **frequencies
复制到arrays2
。捕获是 - 这就是所谓的浅拷贝,即只复制指针值,两个指针指向同一个内存。
在main
函数结束时,arrays1
和arrays2
都被销毁,而在析构函数中,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)
}
}