gpt4 book ai didi

c++ - 使用模板化类指定给 RtlValidateHeap 错误的无效地址

转载 作者:行者123 更新时间:2023-11-30 02:08:23 25 4
gpt4 key购买 nike

我有这门课:

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

我很好奇错误的原因是什么。

先谢谢了,对不起我的英语!

最佳答案

  1. 不要使用void*。您想使用 Boost.Any 或 Boost.Variant(如果要限制允许的类型集,则使用后者)。
  2. 不要使用memcpy。它可能无法与 UDT 一起正常工作。
  3. 不要使用 C 风格的转换。

该错误很可能与您要删除 void* 而不是 T* 这一事实有关。

关于c++ - 使用模板化类指定给 RtlValidateHeap 错误的无效地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6946340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com