删除动态分配的对数组,引发无效地址错误

时间:2018-08-07 00:47:34

标签: c++ pointers memory-management

我有一个很好奇的问题。我有一个自定义类Set和一个自定义类Map(我必须为一个类重新创建标准库实现)。在地图类中,我创建了一个pair<string, Set<string>>数组。但是,当我扩展值数组并重新散列值时,我想删除旧的数组。但是,无论何时何地(以及代码中的任何地方……),我都会遇到Invalid address specified to RtlValidateHeap错误。即使在我的new[]语句之后的行中有删除调用,也会发生这种情况。

我有一个私有类变量,我称之为pair<string, Set<string>> *values;。然后在我的构造函数中执行以下操作。

values = new pair<string, Set<string>>[tableSize];

然后,当我要删除成员函数中的值时,它抛出了无效的地址错误。代码如下-我交换了newValuesvalues,然后交换了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;
};

1 个答案:

答案 0 :(得分:-1)

Remove从构造函数中删除值。如果只想在下一行删除,分配的目的是什么?而且,您还将在下一个for循环块中使用已删除的内存。

由于您已在此处删除它,它将在其他任何地方导致无效的内存访问错误,因为您正试图删除已删除的内存位置。