我想使用带有指针类型的类模板来实现通用数据结构。 当我想使用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
}
任何帮助将不胜感激...
答案 0 :(得分:0)
幸运的是,我意识到这是一个简单的错误。缺少适当的副本构造函数,因此编译器自然会隐式地构造一个副本,并指向指向指针分配的指针,这是错误的根源。
因此上述代码的正确副本构造函数是
Data(const Data<T*> & copy) { data_ptr = new T(*copy.data_ptr); }