删除动态分配的数组对抛出无效地址错误

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() 函数中交换 newValuesvalues,然后是 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 循环块中使用已删除的内存。

由于你在这里删除了它,它会在其他任何地方导致无效的内存访问错误,因为你试图删除已经删除的内存位置。

【讨论】:

抱歉打错了 - 现在已修复

以上是关于删除动态分配的数组对抛出无效地址错误的主要内容,如果未能解决你的问题,请参考以下文章

怎么动态分配指针数组

动态内存分配

内存堆问题 C++,动态分配多维数组

C ++中动态分配的向量中的分段错误

为太多动态分配的数组赋值时程序崩溃 - C++

使用动态数组的 C++ 逻辑错误