使用模板化类对RtlValidateHeap错误指定的地址无效

时间:2011-08-04 18:05:28

标签: c++

我有这堂课:

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

我很好奇这是错误的原因。

非常感谢,对不起我的英语!

2 个答案:

答案 0 :(得分:3)

  1. 请勿使用void*。您想使用Boost.Any或Boost.Variant(后者如果要限制允许类型的集合)。
  2. 请勿使用memcpy。它可能无法与UDT一起正常工作。
  3. 不要使用C风格的演员阵容。
  4. 该错误很可能与您删除void*而非T*的事实有关。

答案 1 :(得分:1)

您正在尝试删除类型为void的指针,这可能会导致许多问题。此外,当您删除void指针时,mValue的析构函数不会触发,因为该对象的类型未知。

相关问题