每次#class模板c ++编译但崩溃

时间:2017-12-15 18:02:34

标签: c++ c++11 templates

我需要你的帮助。我不明白为什么,但是,当我编译我的程序时,它崩溃了。如果我删除

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;
}

3 个答案:

答案 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 []分配的指针。此问题也可能导致崩溃。