删除动态分配的数组对抛出无效地址错误
Posted
技术标签:
【中文标题】删除动态分配的数组对抛出无效地址错误【英文标题】:Deleting a dynamically allocated Array of Pairs throwing invalid address error 【发布时间】: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 -- 希望 - 这是大学课程作业的一部分 -- 没有什么能阻止您创建自己的矢量类。您已经在使用模板——创建一个简单的向量类,然后在哈希表类中使用该类会更有意义。事实上,对我来说,在尝试实现地图类之前没有分配您创建动态数组/向量类,这似乎是荒谬的。或者如果您已经这样做了,请不要在此作业中重复使用该课程。
【参考方案1】:
从构造函数中删除删除值。如果您只是要在下一行中删除,分配的目的是什么?而且您还在下一个 for 循环块中使用已删除的内存。
由于你在这里删除了它,它会在其他任何地方导致无效的内存访问错误,因为你试图删除已经删除的内存位置。
【讨论】:
抱歉打错了 - 现在已修复以上是关于删除动态分配的数组对抛出无效地址错误的主要内容,如果未能解决你的问题,请参考以下文章