我有一个很好奇的问题。我有一个自定义类Set
和一个自定义类Map
(我必须为一个类重新创建标准库实现)。在地图类中,我创建了一个pair<string, Set<string>>
数组。但是,当我扩展值数组并重新散列值时,我想删除旧的数组。但是,无论何时何地(以及代码中的任何地方……),我都会遇到Invalid address specified to RtlValidateHeap
错误。即使在我的new[]
语句之后的行中有删除调用,也会发生这种情况。
我有一个私有类变量,我称之为pair<string, Set<string>> *values;
。然后在我的构造函数中执行以下操作。
values = new pair<string, Set<string>>[tableSize];
然后,当我要删除成员函数中的值时,它抛出了无效的地址错误。代码如下-我交换了newValues
和values
,然后交换了delete newValues
函数中的reallocate()
。那就是抛出错误的地方
节点:地图运行正常。我可以散列,存储和调用值,而不会出现任何错误。
扩展代码:
template<>
class Map<std::string, Set<string>> : public MapInterface<string,Set<string>>{
public:
Map() {
numItems = 0;
tableSize = BonusHashTableSize;
values = new pair<string, Set<string>>[tableSize];
for (int i = 0; i < tableSize; ++i) {
values[i].first = "";
}
};
~Map() {
for (int i = 0; i < tableSize; ++i) {
if (values[i].first != "") {
values[i].second.clear();
}
}
delete[] values;
};
void reallocate() {
tableSize *= 2;
pair<string, Set<string>> *newValues = new pair<string, Set<string>>[tableSize];
for (int i = 0; i < tableSize; ++i) {
newValues[i].first = "";
newValues[i].second = Set<string>();
}
for (int i = 0; i < tableSize / 2; ++i) {
if (values[i].first != "") {
int newIndex = rehash(newValues, values[i].first);
newValues[newIndex].first = values[i].first;
newValues[newIndex].second = values[i].second;
Set<string> test = newValues[newIndex].second;
}
}
std::swap(values, newValues);
delete[] newValues;
//member functions
private:
pair<string, Set<string>> *values;
int tableSize;
int numItems;
};
答案 0 :(得分:-1)
Remove从构造函数中删除值。如果只想在下一行删除,分配的目的是什么?而且,您还将在下一个for循环块中使用已删除的内存。
由于您已在此处删除它,它将在其他任何地方导致无效的内存访问错误,因为您正试图删除已删除的内存位置。