我有这堂课:
class HIDValue{
private:
void* mValue;
UINT mSize;
HIDElement mElement;
public:
HIDValue() {
mValue = 0;
mSize = 0;
}
template <class T>
HIDValue(T pValue, HIDElement pElement) {
mElement = pElement;
mValue = 0;
setValue(pValue);
}
HIDValue(const HIDValue& pValue) {
mSize = pValue.mSize;
mElement = pValue.mElement;
mValue = 0;
if(mSize) {
mValue = new char[mSize];
memcpy(mValue, pValue.mValue, mSize);
}
}
template <class T>
void setValue(T pValue) {
if(mValue)
delete mValue;
mValue = new T;
*((T*)mValue) = *((T*)&pValue);
mSize = sizeof(T);
}
~HIDValue() {
//THE MENTIONED ERROR IS HERE
if(mValue)
delete mValue;
}
void setElement(HIDElement pElement) {
mElement = pElement;
}
const HIDElement& getElement() const {
return mElement;
}
template <class T>
bool getValue(T* pValue) const {
if(mValue && mSize <= sizeof(T)) {
*pValue = *((T*)mValue);
return true;
}
return false;
}
};
通过一些更改,它工作正常:
class HIDValue{
private:
//void* mValue;
char mValue[16];
UINT mSize;
HIDElement mElement;
public:
HIDValue() {
//mValue = 0;
mSize = 0;
}
template <class T>
HIDValue(T pValue, HIDElement pElement) {
mElement = pElement;
//mValue = 0;
setValue(pValue);
}
HIDValue(const HIDValue& pValue) {
mSize = pValue.mSize;
mElement = pValue.mElement;
//mValue = 0;
if(mSize) {
//mValue = new char[mSize];
memcpy(mValue, pValue.mValue, mSize);
}
}
template <class T>
void setValue(T pValue) {
//if(mValue)
// delete mValue;
//mValue = new T;
*((T*)mValue) = *((T*)&pValue);
mSize = sizeof(T);
}
~HIDValue() {
//itten egy hiba vala
//if(mValue)
// delete mValue;
}
void setElement(HIDElement pElement) {
mElement = pElement;
}
const HIDElement& getElement() const {
return mElement;
}
template <class T>
bool getValue(T* pValue) const {
if(mValue && mSize <= sizeof(T)) {
*pValue = *((T*)mValue);
return true;
}
return false;
}
};
我很好奇这是错误的原因。
非常感谢,对不起我的英语!
答案 0 :(得分:3)
void*
。您想使用Boost.Any或Boost.Variant(后者如果要限制允许类型的集合)。memcpy
。它可能无法与UDT一起正常工作。该错误很可能与您删除void*
而非T*
的事实有关。
答案 1 :(得分:1)
您正在尝试删除类型为void的指针,这可能会导致许多问题。此外,当您删除void指针时,mValue的析构函数不会触发,因为该对象的类型未知。