类模板指针类型析构函数错误Visual Studio 2015 v140

时间:2019-02-17 15:11:50

标签: c++ class pointers templates operator-overloading

我想使用带有指针类型的类模板来实现通用数据结构。 当我想使用Operator +程序时出现“访问冲突读取位置”错误(如下所示)。给出了最低工作代码。

这是主要定义

.column{
  height: 100vh;
  overflow-x: hidden;
}
.scrollable-text{
  width: calc(100% + 30px);
  overflow-y: scroll;
  box-sizing: border-box;
  height: 100%;
}
.column-first{
  color: #fff;
  background-color: #02547D;
}
.column-second{
  color: #fff;
  background-color: #0285A8;
}
.column-third{
  color: #fff;
  background-color: #02BEC4;
}

在线错误:operator +(上面调用了析构函数)

template <class T>
class Data
{
  public:
     Data() {}  
     ~Data() {}

  public:
  T m_value;
};

//This is the specialization for pointer types
template <class T>
class Data<T*>
{
 public:
    Data()  { m_value = new T();} 
    //~Data() {delete m_value;}   ********This gives error***
    ~Data() {}                   //****** This works 

    Data(const T value)  { m_value = new T(value); }

    template <class T>
    friend Data<T*> operator+(Data<T*> a, Data<T*> b);

    Data<T*>& operator=(const Data<T*> value);

 public:
    T* m_value;
};


//friend operator+
template <class T>
Data<T*> operator+(Data<T*> a, Data<T*> b)
{ 
    Data<T*> temp(*a.m_value + *b.m_value);
    return temp;
}

//member operator=
template <class T>
Data<T*>& Data<T*>::operator=(const Data<T*> value)
{
    if (!this->m_value)
        this->m_value = new T();

    *this->m_value = *value.m_value;
    return *this;
}

删除操作员时发生错误

void main()    
{
    typedef Data<int *> Data_Int;

    Data_Int dt1(100);
    Data_Int dt2(200);
    Data_Int dt3;

    dt3 = dt1 + dt2; // error line              

}

错误输出

void __CRTDECL operator delete(void* const block) noexcept
{
    #ifdef _DEBUG
    _free_dbg(block, _UNKNOWN_BLOCK); //Error line 
    #else
    free(block);
    #endif
}

任何帮助将不胜感激...

1 个答案:

答案 0 :(得分:0)

幸运的是,我意识到这是一个简单的错误。缺少适当的副本构造函数,因此编译器自然会隐式地构造一个副本,并指向指向指针分配的指针,这是错误的根源。

因此上述代码的正确副本构造函数是

Data(const Data<T*> & copy) { data_ptr = new T(*copy.data_ptr); }