【发布时间】:2018-08-07 00:47:33
【问题描述】:
我有一个非常奇怪的问题。我有一个自定义类Set 和一个自定义类Map(我必须为一个类重新创建标准库实现)。在我的地图类中,我创建了一个 pair<string, Set<string>> 数组。但是,当我扩展我的值数组并重新散列值时,我想删除我的旧数组。但是,无论何时(以及在我的代码中的任何地方......)我尝试,我都会收到 Invalid address specified to RtlValidateHeap 错误。即使删除调用在我的new[] 语句之后上线,也会发生这种情况。
我有私有类变量,我称之为pair<string, Set<string>> *values;。然后在我的构造函数中执行以下操作。
values = new pair<string, Set<string>>[tableSize];
然后,当我要删除成员函数中的值时,它会抛出无效地址错误。代码如下 - 我在 reallocate() 函数中交换 newValues 和 values,然后是 delete newValues。这就是引发错误的地方
节点:地图运行良好。我可以散列、存储和调用值而不会出现任何错误。
扩展代码:
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;
};
【问题讨论】:
-
你需要像在析构函数中一样使用
delete[] values。 -
谢谢 - 在声明后立即删除值,但它仍然在我的代码后面引发错误
-
你认为你在构造函数中有
delete values是为了什么?您分配一个数组,然后莫名其妙地立即删除它(错误地,启动),然后取消引用现在悬空的指针,因此您的程序表现出未定义的行为。 -
delete values;在构造函数中没有意义!您不应该在之后使用它时删除值,这是使用delete而不是delete[]的未定义行为。 你为什么要写这样的代码? 还有你为什么要手动分配和删除数组而不是使用std::vector。 -
@chargerstriker -- 希望 - 这是大学课程作业的一部分 -- 没有什么能阻止您创建自己的矢量类。您已经在使用模板——创建一个简单的向量类,然后在哈希表类中使用该类会更有意义。事实上,对我来说,在尝试实现地图类之前没有分配您创建动态数组/向量类,这似乎是荒谬的。或者如果您已经这样做了,请不要在此作业中重复使用该课程。
标签: c++ pointers memory-management