我需要你的帮助。我不明白为什么,但是,当我编译我的程序时,它崩溃了。如果我删除
bool c = tabInt==TabInt2;
在我的主要内容中,它不会崩溃。您对如何解决问题有任何想法吗?
MonTableau.h
template <class Type> class MonTableau
{
private:
int debut;
int fin;
int taille;
Type * adr;
public:
MonTableau (int, int);
MonTableau (int);
~MonTableau();
Type & operator [] (int);
bool operator == (MonTableau) const;
bool operator != (MonTableau) const;
};
MonTableau.cpp
#include <iostream>
#include "MonTableau.h"
using namespace std;
template<class Type>
MonTableau<Type> :: MonTableau (int d, int f)
{
if(f>d)
{
debut=d; fin=f ; taille= f-d; adr= new Type [taille];
}
else
{
cout << "Taille non valide" << endl;
}
}
template<class Type>
MonTableau<Type>:: MonTableau (int f)
{
if(f>0)
{
debut=0; fin=taille=f ; adr= new Type [taille];
}
else
{
cout << "Taille non valide" << endl;
}
}
template<class Type>
MonTableau<Type>:: ~MonTableau() {delete adr;}
template<class Type>
Type& MonTableau<Type>:: operator [] (int i)
{
return adr[i-debut];
}
template<class Type>
bool MonTableau<Type> :: operator == (MonTableau a) const
{
if(taille==a.taille)
{
for(int k=0;k<taille;k++)
{
if( adr[k] != a.adr[k]) return false;
}
return true;
}
else return false;
}
template<class Type>
bool MonTableau<Type>:: operator != (MonTableau a) const
{
if(taille==a.taille)
{
for(int i=0;i<taille;i++)
{
if(adr[i]!=a.adr[i]) return true;
}
return false;
}
else return true;
}
int main()
{
MonTableau<int> tabInt(5);
MonTableau<int> TabInt2(-2,3);
for(int i=0;i<5;i++)
{
TabInt2[i-2]=tabInt[i]=i;
}
bool c = tabInt==TabInt2;
return 0;
}
答案 0 :(得分:1)
问题在于您没有关注The Rule of Three。
当您调用operator==
函数时,您正在制作对象的浅表副本。当对象超出范围时,删除内存。当main
中的变量超出范围时,将再次删除该内存。这会导致未定义的行为。在您的情况下,这会导致程序崩溃。
您可以通过在const&
和operator==
函数中传递operator!=
来暂时解决问题。
bool operator == (MonTableau const&) const;
bool operator != (MonTableau const&) const;
真正的解决方法是关注The Rule of Three。
答案 1 :(得分:0)
这一行是错的:
TabInt2[i-2]=tabInt[i]=i;
您将i初始化为0,但随后修改索引-2处的项目。
此外,您不初始化以下成员,因此它们的值未定义:
int taille;
Type * adr;
答案 2 :(得分:0)
问题(我想)是你的班级没有复制构造函数。
因此,当您将MonTableau a
作为复制传递给operator!=()
时,副本a
包含adr
,其值与调用值相同TabInt2
。
因此new[]
adr
中分配的内存(TabInt2
)被销毁两次:operator!=()
中的第一个;第二次在main()
。
这是一个典型的崩溃原因。
PS:正如molbdnilo所观察到的,你必须使用delete []
来指定由new []
分配的指针。此问题也可能导致崩溃。